<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>cpp | Academic</title><link>https://loloxwg.top/tag/cpp/</link><atom:link href="https://loloxwg.top/tag/cpp/index.xml" rel="self" type="application/rss+xml"/><description>cpp</description><generator>Wowchemy (https://wowchemy.com)</generator><language>en-us</language><lastBuildDate>Thu, 02 Mar 2023 12:34:40 +0000</lastBuildDate><image><url>https://loloxwg.top/media/icon_hu0b7a4cb9992c9ac0e91bd28ffd38dd00_9727_512x512_fill_lanczos_center_3.png</url><title>cpp</title><link>https://loloxwg.top/tag/cpp/</link></image><item><title>C++中的const</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84const-f78cd58e7f3c44adac55620e8d3efa13/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84const-f78cd58e7f3c44adac55620e8d3efa13/</guid><description>&lt;p>在C++中，&lt;code>const&lt;/code>是一个关键字，用于指定一个变量或对象的值将不会被修改。 &lt;code>const&lt;/code>可以用于不同的变量类型，例如整数，浮点数，字符，指针等。在这个文档中，我们将探讨&lt;code>const&lt;/code>的一些用途。&lt;/p>
&lt;h2 id="常量">常量&lt;/h2>
&lt;p>使用&lt;code>const&lt;/code>定义常量是C++中的一种最常见的用途。 在定义变量时，将变量定义为&lt;code>const&lt;/code>将确保在程序的其余部分中不会更改变量的值。 这对于程序的可维护性和易读性非常重要。&lt;/p>
&lt;p>以下是一个使用&lt;code>const&lt;/code>定义常量的示例：&lt;/p>
&lt;pre tabindex="0">&lt;code>const int MAX_VALUE = 100;
&lt;/code>&lt;/pre>&lt;p>在上面的示例中，我们定义了一个名为&lt;code>MAX_VALUE&lt;/code>的常量，并将其值设置为100。 在程序的其余部分中，当我们使用&lt;code>MAX_VALUE&lt;/code>时，我们知道它的值将始终为100。&lt;/p>
&lt;h2 id="函数参数">函数参数&lt;/h2>
&lt;p>在函数定义中，&lt;code>const&lt;/code>可以用于指定参数是只读的。 这可以确保在函数内部不会更改参数的值。 这对于编写安全和可靠的代码非常重要。&lt;/p>
&lt;p>以下是一个使用&lt;code>const&lt;/code>在函数参数中指定只读的示例：&lt;/p>
&lt;pre tabindex="0">&lt;code>int sum(const int x, const int y)
{
return x + y;
}
&lt;/code>&lt;/pre>&lt;p>在上面的示例中，我们定义了一个名为&lt;code>sum&lt;/code>的函数，它接受两个&lt;code>const&lt;/code>整数参数，这意味着函数内部不会更改这些参数的值。&lt;/p>
&lt;h2 id="成员函数">成员函数&lt;/h2>
&lt;p>在C++中，&lt;code>const&lt;/code>也可以用于类的成员函数。 &lt;code>const&lt;/code>成员函数保证不会修改类的数据成员，因此它们可以安全地由&lt;code>const&lt;/code>对象调用。&lt;/p>
&lt;p>以下是一个使用&lt;code>const&lt;/code>在类的成员函数中指定只读的示例：&lt;/p>
&lt;pre tabindex="0">&lt;code>class MyClass
{
public:
int getValue() const
{
return value;
}
private:
int value = 10;
};
int main()
{
const MyClass obj;
std::cout &amp;lt;&amp;lt; obj.getValue() &amp;lt;&amp;lt; std::endl;
return 0;
}
&lt;/code>&lt;/pre>&lt;p>在上面的示例中，我们定义了一个名为&lt;code>MyClass&lt;/code>的类，它具有一个&lt;code>const&lt;/code>成员函数&lt;code>getValue()&lt;/code>，该函数返回类的值成员。 在&lt;code>main()&lt;/code>函数中，我们创建了一个&lt;code>const&lt;/code>对象&lt;code>obj&lt;/code>，并调用了&lt;code>getValue()&lt;/code>函数，因为该函数是&lt;code>const&lt;/code>成员函数，因此可以安全地由&lt;code>const&lt;/code>对象调用。&lt;/p>
&lt;h2 id="总结">总结&lt;/h2>
&lt;p>在C++中，&lt;code>const&lt;/code>是一种非常有用的关键字，用于定义常量，指定函数参数为只读以及定义类的&lt;code>const&lt;/code>成员函数。 这对于编写安全和可维护的代码非常重要。&lt;/p>
&lt;h1 id="const-和static的区别">const 和static的区别&lt;/h1>
&lt;p>&lt;code>const&lt;/code>和&lt;code>static&lt;/code>是C++中两个非常常见的关键字，它们的用途有些相似，但也有很多不同之处。 &lt;code>const&lt;/code>用于指定变量值不会被修改，而&lt;code>static&lt;/code>用于指定变量在整个程序生命周期内只有一个实例。&lt;/p>
&lt;p>其中，&lt;code>const&lt;/code>和&lt;code>static&lt;/code>还有一个重要的区别：&lt;code>const&lt;/code>变量可以在编译时初始化，而&lt;code>static&lt;/code>变量必须在程序运行时初始化。这意味着&lt;code>const&lt;/code>变量的值不能在程序运行时更改，而&lt;code>static&lt;/code>变量的值可以在程序运行时更改。&lt;/p>
&lt;p>另一个重要的区别是，&lt;code>const&lt;/code>变量在程序的整个生命周期内都是只读的，而&lt;code>static&lt;/code>变量可以在程序的任何地方进行读写操作。因此，&lt;code>const&lt;/code>变量是更加安全和可靠的，而&lt;code>static&lt;/code>变量则更加灵活和易于使用。&lt;/p>
&lt;h1 id="const--int-和-int-const--和-int--const">const int *和 int const * 和 int * const&lt;/h1>
&lt;p>&lt;code>const int *&lt;/code>和&lt;code>int const *&lt;/code>是等效的，指针指向常量，它们都表示指向常量整数的指针，这意味着指向的内容不能更改。 （const 在 * 前）&lt;/p>
&lt;p>&lt;code>int * const&lt;/code>表示一个指针是常量，该指针不能修改，但是可以更改指针指向的内容。(const 在 * 后)&lt;/p>
&lt;blockquote>
&lt;p>int * const a 代表这个指针 const了 不能改
int const *b 代表这个指针指的内容不能动了&lt;/p>
&lt;/blockquote>
&lt;p>注意，&lt;code>const&lt;/code>关键字可以位于&lt;code>*&lt;/code>的左侧或右侧，含义不同&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Hello, World!&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">*&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">//a=new int(2); error
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">const&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">c&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// *b=2; error
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// *c=3; error
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">new&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">c&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">new&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">c&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>const int * const a&lt;/code>表示一个指针是常量，指向的内容也是常量，指针和指向的内容都不能修改。&lt;/p>
&lt;p>const int * const GetX() const&lt;/p>
&lt;p>&lt;code>const int *&lt;/code>和&lt;code>int const *&lt;/code>是等效的，都表示指向常量整数的指针。
&lt;code>int * const&lt;/code>表示指针是常量，指针指向的内容可以改变。
在函数返回值类型前面的&lt;code>const&lt;/code>表示函数返回值是常量，不能被修改。&lt;/p>
&lt;p>在C++中，&lt;code>const&lt;/code>也可以用于类的成员函数。 &lt;code>const&lt;/code>成员函数保证不会修改类的数据成员，因此它们可以安全地由&lt;code>const&lt;/code>对象调用。&lt;/p>
&lt;p>以下是一个使用&lt;code>const&lt;/code>在类的成员函数中指定只读的示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">MyClass&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">getValue&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="k">const&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">value&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">private&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">value&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">const&lt;/span> &lt;span class="n">MyClass&lt;/span> &lt;span class="n">obj&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">obj&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">getValue&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在上面的示例中，我们定义了一个名为&lt;code>MyClass&lt;/code>的类，它具有一个&lt;code>const&lt;/code>成员函数&lt;code>getValue()&lt;/code>，该函数返回类的值成员。 在&lt;code>main()&lt;/code>函数中，我们创建了一个&lt;code>const&lt;/code>对象&lt;code>obj&lt;/code>，并调用了&lt;code>getValue()&lt;/code>函数，因为该函数是&lt;code>const&lt;/code>成员函数，因此可以安全地由&lt;code>const&lt;/code>对象调用。&lt;/p>
&lt;ul>
&lt;li>&lt;code>const int *&lt;/code>和&lt;code>int const *&lt;/code>是等效的，都表示指向常量整数的指针。&lt;/li>
&lt;li>&lt;code>int * const&lt;/code>表示指针是常量，指针指向的内容可以改变。&lt;/li>
&lt;li>&lt;code>const int * const&lt;/code>表示指针是常量，指向的内容也是常量，指针和指向的内容都不能修改。&lt;/li>
&lt;/ul></description></item><item><title>C++中的mutable</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84mutable-0edc2ed4eb114446ae9c96b81a74de74/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84mutable-0edc2ed4eb114446ae9c96b81a74de74/</guid><description>&lt;p>在C++中，关键字&lt;code>mutable&lt;/code>用于允许一个&lt;code>const&lt;/code>对象的成员变量被修改。在使用&lt;code>mutable&lt;/code>关键字修饰的成员变量的时候，可以在&lt;code>const&lt;/code>成员函数中修改该变量。这是因为，&lt;code>const&lt;/code>成员函数默认情况下不允许修改类的数据成员。&lt;/p>
&lt;p>&lt;code>mutable&lt;/code>关键字通常用于缓存变量（cache variable）。一个&lt;code>const&lt;/code>成员函数可以使用&lt;code>mutable&lt;/code>修饰的变量作为缓存，来避免重复计算。同时，由于该变量是&lt;code>mutable&lt;/code>的，因此即使在&lt;code>const&lt;/code>成员函数中，也可以被修改。&lt;/p>
&lt;p>下面是一个示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">MyClass&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">myFunc&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="n">cacheValid&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// perform some heavy calculations
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// and store the result in cache
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cache&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">42&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cacheValid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// use cache
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">private&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">mutable&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">cache&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">mutable&lt;/span> &lt;span class="kt">bool&lt;/span> &lt;span class="n">cacheValid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在上面的示例中，cache和cacheValid被标记为mutable，因此可以在const成员函数myFunc()中被修改。如果没有mutable关键字，cache和cacheValid就不能在const成员函数中被修改。&lt;/p>
&lt;p>需要注意的是，mutable变量的修改只在当前对象中生效，不会影响到其他对象。因此，mutable变量不会破坏C++的const语义。&lt;/p></description></item><item><title>C++中的static</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84static-eb2478cbe8134fcf9c35f28028be93c5/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84static-eb2478cbe8134fcf9c35f28028be93c5/</guid><description>&lt;p>在C++中，static是一种关键字，它可以应用于不同的元素，例如变量、函数和类成员等，它的含义有所不同。&lt;/p>
&lt;h2 id="静态变量">静态变量&lt;/h2>
&lt;p>当static用于变量时，它可以将变量声明为静态变量。静态变量有以下特点：&lt;/p>
&lt;ul>
&lt;li>静态变量存储在静态存储区，而不是栈上或堆上。&lt;/li>
&lt;li>静态变量在程序运行时只被初始化一次，并一直存在于内存中，直到程序结束。&lt;/li>
&lt;li>静态变量默认被初始化为0。&lt;/li>
&lt;/ul>
&lt;p>下面是一个使用静态变量的示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">increment&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">static&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">i&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">increment&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">increment&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">increment&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>输出：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mi">3&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="静态函数">静态函数&lt;/h2>
&lt;p>当static用于函数时，它可以将函数声明为静态函数。静态函数有以下特点：&lt;/p>
&lt;ul>
&lt;li>静态函数只能在声明它的文件中使用，不能被其他文件调用。&lt;/li>
&lt;li>静态函数不能访问非静态变量。&lt;/li>
&lt;/ul>
&lt;p>下面是一个使用静态函数的示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">static&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="nf">static_function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;This is a static function.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">non_static_function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;This is a non-static function.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">static_function&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">non_static_function&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>输出：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="n">This&lt;/span> &lt;span class="n">is&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="k">static&lt;/span> &lt;span class="n">function&lt;/span>&lt;span class="p">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">This&lt;/span> &lt;span class="n">is&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="n">non&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">static&lt;/span> &lt;span class="n">function&lt;/span>&lt;span class="p">.&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="静态类成员">静态类成员&lt;/h2>
&lt;p>当static用于类的成员变量和成员函数时，它可以将它们声明为静态成员。静态成员有以下特点：&lt;/p>
&lt;ul>
&lt;li>静态成员是类的所有对象共享的，它们只有一份拷贝。&lt;/li>
&lt;li>静态成员可以被类的所有对象访问和修改，也可以通过类名和作用域运算符直接访问和修改。&lt;/li>
&lt;li>静态成员可以初始化为常量或表达式。&lt;/li>
&lt;/ul>
&lt;p>下面是一个使用静态类成员的示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">class&lt;/span> &lt;span class="n">MyClass&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nl">public&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">static&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">static_variable&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">static&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="nf">static_function&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">non_static_variable&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="nf">non_static_function&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="n">MyClass&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">static_variable&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="n">MyClass&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">static_function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;This is a static function.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="n">MyClass&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">non_static_function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;This is a non-static function.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="n">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">MyClass&lt;/span> &lt;span class="n">obj1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">obj2&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">obj1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">static_variable&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">obj2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">static_variable&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">obj1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">static_variable&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">obj2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">static_variable&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">obj1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">static_function&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">obj1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">non_static_function&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>输出：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">This&lt;/span> &lt;span class="n">is&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="k">static&lt;/span> &lt;span class="n">function&lt;/span>&lt;span class="p">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">This&lt;/span> &lt;span class="n">is&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="n">non&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">static&lt;/span> &lt;span class="n">function&lt;/span>&lt;span class="p">.&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>单例模式是一种常见的设计模式，它可以确保一个类只有一个实例，并提供访问该实例的全局点。&lt;/p>
&lt;p>下面是使用静态方法实现单例模式的示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">class&lt;/span> &lt;span class="n">Singleton&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nl">public&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">static&lt;/span> &lt;span class="n">Singleton&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">getInstance&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">static&lt;/span> &lt;span class="n">Singleton&lt;/span> &lt;span class="n">instance&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">instance&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">showMessage&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Hello, World!&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nl">private&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Singleton&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Singleton&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">Singleton&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Singleton&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">operator&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">Singleton&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Singleton&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">instance1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Singleton&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">getInstance&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Singleton&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">instance2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Singleton&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">getInstance&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">instance1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">showMessage&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">instance2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">showMessage&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>输出：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Hello&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">World&lt;/span>&lt;span class="o">!&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Hello&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">World&lt;/span>&lt;span class="o">!&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在上面的示例中，getInstance方法是静态方法，它返回一个Singleton类的引用。在该方法中，我们使用了静态变量instance来保存Singleton类的唯一实例。由于静态变量存储在静态存储区，因此它们只会被初始化一次，并一直存在于内存中，直到程序结束。通过返回instance的引用，我们可以在程序的任何地方访问Singleton类的唯一实例。&lt;/p>
&lt;p>请注意，在Singleton类的构造函数、拷贝构造函数和赋值运算符中，我们将它们声明为私有的。这是因为我们不希望用户创建Singleton类的其他实例，从而确保Singleton类只有一个实例。&lt;/p></description></item><item><title>C++中的可见性</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E5%8F%AF%E8%A7%81%E6%80%A7-0ae232d21aa34b14aacc7c41515ef775/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E5%8F%AF%E8%A7%81%E6%80%A7-0ae232d21aa34b14aacc7c41515ef775/</guid><description>&lt;h1 id="c中的可见性">C++中的可见性&lt;/h1>
&lt;p>在C++中，可见性是一个非常重要的概念。它指的是变量、函数、类等在不同的作用域中的可见性范围。C++中的作用域分为全局作用域和局部作用域。&lt;/p>
&lt;p>在全局作用域中定义的变量、函数、类等可以在文件的任何地方被访问，也可以被其他文件所共享。而在局部作用域中定义的变量、函数、类等只能在其定义的块中被访问，无法被其他块所访问。&lt;/p>
&lt;p>在C++中，还有一些特殊的作用域，例如命名空间。命名空间可以将一组相关的变量、函数、类等组织在一起，以避免命名冲突并提高代码的可读性。&lt;/p>
&lt;h1 id="访问修饰符">访问修饰符&lt;/h1>
&lt;p>另外，在C++中，还可以使用访问修饰符来控制类成员的可见性。C++中有三种访问修饰符，分别是public、private和protected。public修饰符表示该成员对外可见，可以被类的外部和派生类访问；private修饰符表示该成员仅对类内可见，不可以被类的外部和派生类访问；protected修饰符表示该成员仅对类内和派生类可见，不可以被类的外部访问。&lt;/p>
&lt;blockquote>
&lt;p>class 里不写 默认 private
struct 里不写 默认 public&lt;/p>
&lt;/blockquote>
&lt;h2 id="友元类">友元类&lt;/h2>
&lt;p>除了访问修饰符，C++还提供了友元类的概念。友元类可以访问类的私有和保护成员，但并不是类的成员。使用友元类可以在一定程度上突破类成员访问权限的限制，但也需要慎重使用，以避免破坏类的封装性和数据安全。&lt;/p>
&lt;p>总之，C++中的可见性是一个非常重要的概念。了解和掌握好C++中的可见性，可以帮助我们更好地组织和管理代码，提高代码的可读性和可维护性。&lt;/p></description></item><item><title>C++中的字符串</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2-c1aea693e5cc47d8a53110577af87660/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2-c1aea693e5cc47d8a53110577af87660/</guid><description>&lt;p>在C++中，字符串是一组字符的序列。在处理字符串时，我们会用到char类型。&lt;/p>
&lt;h2 id="char类型">Char类型&lt;/h2>
&lt;p>Char是C++中的一种数据类型，表示单个字符。我们可以使用单引号将字符括起来，例如：&lt;/p>
&lt;pre tabindex="0">&lt;code>char letter = &amp;#39;a&amp;#39;;
&lt;/code>&lt;/pre>&lt;p>Char类型占用1个字节的内存空间，可以存储所有ASCII字符集中的字符，包括字母、数字、符号等。在C++中，char类型的取值范围是-128到127。&lt;/p>
&lt;p>在处理字符串时，我们通常会将一组字符存储在char类型的数组中。&lt;/p>
&lt;h2 id="字符数组">字符数组&lt;/h2>
&lt;p>C++中的字符串可以通过字符数组来实现。例如：&lt;/p>
&lt;pre tabindex="0">&lt;code>char str[10] = &amp;#34;Hello World&amp;#34;;
&lt;/code>&lt;/pre>&lt;p>这里定义了一个名为str的字符数组，并初始化为&amp;quot;Hello World&amp;quot;。我们可以使用类似于访问数组元素的方式来访问字符串中的每个字符。例如，要访问字符串中的第一个字符，可以使用以下代码：&lt;/p>
&lt;pre tabindex="0">&lt;code>char first = str[0];
&lt;/code>&lt;/pre>&lt;h2 id="字符串库">字符串库&lt;/h2>
&lt;p>C++中提供了一些字符串处理的函数，例如strlen、strcpy、strcat等。这些函数可以帮助我们更方便地处理字符串。&lt;/p>
&lt;ul>
&lt;li>strlen：用于获取字符串的长度。&lt;/li>
&lt;li>strcpy：用于将一个字符串复制到另一个字符串中。&lt;/li>
&lt;li>strcat：用于将一个字符串拼接到另一个字符串的末尾。&lt;/li>
&lt;/ul>
&lt;pre tabindex="0">&lt;code>char str1[6] = &amp;#34;Hello&amp;#34;;
char str2[6] = &amp;#34;World&amp;#34;;
char str3[50];
int len;
// 复制str1到str3
strcpy(str3, str1);
// 将str2拼接到str3末尾
strcat(str3, str2);
// 获取str3的长度
len = strlen(str3);
&lt;/code>&lt;/pre>&lt;p>以上代码将会得到str3的值为&amp;quot;Hello World&amp;quot;，len的值为11。&lt;/p>
&lt;h1 id="char--的隐式转换">char * 的隐式转换&lt;/h1>
&lt;p>在C++中，&lt;code>char * str&lt;/code> 和 &lt;code>char str[]&lt;/code> 都可以用来表示字符串，但是它们有一些区别。&lt;/p>
&lt;p>&lt;code>char * str&lt;/code> 实际上是一个指向字符数组的指针，它指向的是字符串的首地址。我们可以通过改变指针的位置来改变字符串的内容。例如：&lt;/p>
&lt;pre tabindex="0">&lt;code>char * str = &amp;#34;Hello&amp;#34;;
str = &amp;#34;World&amp;#34;;
&lt;/code>&lt;/pre>&lt;p>这里我们将指针&lt;code>str&lt;/code>从原来的&amp;quot;Hello&amp;quot;改变为了&amp;quot;World&amp;quot;。&lt;/p>
&lt;p>另一方面，&lt;code>char str[]&lt;/code> 是一个字符数组，它在定义时需要指定数组的长度，且该长度不能被改变。例如：&lt;/p>
&lt;pre tabindex="0">&lt;code>char str[10] = &amp;#34;Hello&amp;#34;;
&lt;/code>&lt;/pre>&lt;p>在这个例子中，定义了一个长度为10的字符数组，并将其初始化为&amp;quot;Hello&amp;quot;。如果我们想要将另一个字符串复制到该数组中，我们需要使用字符串库函数&lt;code>strcpy&lt;/code>，例如：&lt;/p>
&lt;pre tabindex="0">&lt;code>char str[10];
strcpy(str, &amp;#34;World&amp;#34;);
&lt;/code>&lt;/pre>&lt;p>这里我们使用了&lt;code>strcpy&lt;/code>函数将&amp;quot;World&amp;quot;复制到了&lt;code>str&lt;/code>数组中。&lt;/p>
&lt;p>总的来说，&lt;code>char * str&lt;/code> 更加灵活，可以通过改变指针的位置来改变字符串的内容，但是需要注意指针的安全性。&lt;code>char str[]&lt;/code> 在定义时需要指定数组的长度，更加安全，但是不够灵活。&lt;/p>
&lt;p>举个例子：&lt;/p>
&lt;pre tabindex="0">&lt;code>char * str = &amp;#34;Hello&amp;#34;;
cout &amp;lt;&amp;lt; str &amp;lt;&amp;lt; endl; // 输出 &amp;#34;Hello&amp;#34;
str = &amp;#34;World&amp;#34;;
cout &amp;lt;&amp;lt; str &amp;lt;&amp;lt; endl; // 输出 &amp;#34;World&amp;#34;
char str2[10] = &amp;#34;Hello&amp;#34;;
cout &amp;lt;&amp;lt; str2 &amp;lt;&amp;lt; endl; // 输出 &amp;#34;Hello&amp;#34;
strcpy(str2, &amp;#34;World&amp;#34;);
cout &amp;lt;&amp;lt; str2 &amp;lt;&amp;lt; endl; // 输出 &amp;#34;World&amp;#34;
&lt;/code>&lt;/pre>&lt;blockquote>
&lt;p>一般用 char * str 好操作 ，要不你char str[] 这种数组你在最后得给他加\0 才算是字符串呢&lt;/p>
&lt;/blockquote>
&lt;h1 id="0">‘\0’&lt;/h1>
&lt;p>在C++中，&amp;rsquo;\0&amp;rsquo;是一个特殊的字符，表示字符串的结束。在使用字符数组表示字符串时，我们需要在数组的末尾添加&amp;rsquo;\0&amp;rsquo;来表示字符串的结束。例如：&lt;/p>
&lt;pre tabindex="0">&lt;code>char str[10] = &amp;#34;Hello&amp;#34;;
str[5] = &amp;#39;\0&amp;#39;;
&lt;/code>&lt;/pre>&lt;p>这里我们将字符数组&lt;code>str&lt;/code>的第6个元素赋值为&amp;rsquo;\0&amp;rsquo;，表示字符串的结束。此时，&lt;code>str&lt;/code>中存储的字符串为&amp;quot;Hello&amp;quot;。&lt;/p>
&lt;p>总的来说，对于字符数组表示的字符串，我们需要注意添加&amp;rsquo;\0&amp;rsquo;来表示字符串的结束，避免出现意外的错误。&lt;/p>
&lt;h1 id="includestring">#include&lt;string>&lt;/h1>
&lt;p>在C++中，除了使用char类型和字符数组来处理字符串，我们还可以使用&lt;string>库。这个库提供了丰富的字符串处理函数，例如length、substr、find等。使用这些函数可以更加方便地进行字符串操作。&lt;/p>
&lt;p>例如，我们可以使用以下代码来创建一个字符串对象并输出其长度：&lt;/p>
&lt;pre tabindex="0">&lt;code>#include &amp;lt;string&amp;gt;
#include &amp;lt;iostream&amp;gt;
using namespace std;
int main() {
string str = &amp;#34;Hello World&amp;#34;;
cout &amp;lt;&amp;lt; str.length() &amp;lt;&amp;lt; endl;
return 0;
}
&lt;/code>&lt;/pre>&lt;p>以上代码将会输出字符串&amp;quot;Hello World&amp;quot;的长度，也就是11。&lt;/p>
&lt;p>总的来说，C++提供了多种处理字符串的方法，我们可以根据实际情况选择合适的方法来进行字符串操作。&lt;/p>
&lt;blockquote>
&lt;p>底层是 &lt;strong>const&lt;/strong> char[]&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%20c1aea693e5cc47d8a53110577af87660/Untitled.png" alt="Untitled" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;/blockquote>
&lt;h2 id="总结">总结&lt;/h2>
&lt;p>在C++中，我们可以使用char类型和字符数组来处理字符串。同时，也可以利用C++提供的字符串库函数进行更方便的字符串处理操作。&lt;/p></description></item><item><title>C++中的字符串字面量</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%AD%97%E9%9D%A2%E9%87%8F-0d677efe66d24fa48892844cda209126/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%AD%97%E9%9D%A2%E9%87%8F-0d677efe66d24fa48892844cda209126/</guid><description>&lt;p>C++中的字符串字面量是由双引号包围的字符序列。它们被视为指向字符数组的指针，其中数组的最后一个元素是空字符。以下是一个字符串字面量的示例：&lt;/p>
&lt;pre tabindex="0">&lt;code>const char* str = &amp;#34;Hello, World!&amp;#34;;
&lt;/code>&lt;/pre>&lt;p>在上面的示例中，&amp;ldquo;Hello, World!&amp;ldquo;是字符串字面量。可以在程序中使用字符串字面量来表示文本或字符序列。例如，您可以将它们用作函数参数或将它们赋值给字符数组变量。&lt;/p>
&lt;blockquote>
&lt;p>需要注意的是，字符串字面量是常量，不允许修改其内容。如果您尝试修改字符串字面量中的任何字符，则会导致编译错误。
比如你想这么搞&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">const&lt;/span> &lt;span class="kt">char&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">str&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;Hello, World!&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">str&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sc">&amp;#39;x&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">就会报错了&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>另外，C++11引入了原始字符串字面量，它们由R&amp;rdquo;()&amp;ldquo;语法表示，其中括号内的字符序列被视为原始字符串。这意味着在原始字符串中，转义字符不会被解释。以下是一个原始字符串字面量的示例：&lt;/p>
&lt;pre tabindex="0">&lt;code>const char* raw_str = R&amp;#34;(C:\\Users\\John\\Documents\\)&amp;#34;;
&lt;/code>&lt;/pre>&lt;p>在上面的示例中，R&amp;rdquo;()&amp;ldquo;中的字符序列被视为原始字符串，其中的反斜杠不需要进行转义。&lt;/p>
&lt;p>总之，字符串字面量是C++中常用的表示文本或字符序列的方式，而原始字符串字面量则可以方便地表示包含反斜杠的路径或正则表达式等。&lt;/p>
&lt;h1 id="别的char类型">别的char类型&lt;/h1>
&lt;p>在C++中，除了字符串字面量外，还有其他类型的字符字面量。例如，单引号括起来的字符字面量表示单个字符。例如，&amp;lsquo;a&amp;rsquo;表示字符a，&amp;lsquo;0&amp;rsquo;表示数字0。这些字符字面量可以用作函数参数或赋值给字符变量。&lt;/p>
&lt;p>此外，还有一种宽字符字面量，用L&amp;quot;&amp;ldquo;语法表示。它们与字符串字面量类似，但使用宽字符（wchar_t）而不是普通字符（char）。这些宽字符字面量在处理国际化和本地化问题时非常有用&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%AD%97%E9%9D%A2%E9%87%8F%200d677efe66d24fa48892844cda209126/Untitled.png" alt="Untitled" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h1 id="字符串相加不能直接用">字符串相加不能直接用+&lt;/h1>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%AD%97%E9%9D%A2%E9%87%8F%200d677efe66d24fa48892844cda209126/Untitled%201.png" alt="Untitled" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>因为这些事字符串字面量，实际上他们是字符数组，或者字符指针，所以我们不能把两个指针相加&lt;/p>
&lt;h2 id="解决方案1">解决方案1&lt;/h2>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%AD%97%E9%9D%A2%E9%87%8F%200d677efe66d24fa48892844cda209126/Untitled%202.png" alt="Untitled" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h2 id="解决方案2">解决方案2&lt;/h2>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%AD%97%E9%9D%A2%E9%87%8F%200d677efe66d24fa48892844cda209126/Untitled%203.png" alt="Untitled" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>s其实就是个操作函数&lt;/p>
&lt;h1 id="字符串字面量在内存中">字符串字面量在内存中&lt;/h1>
&lt;p>在C++中，字符串字面量被存储在程序的&lt;strong>只读数据区&lt;/strong>中，并在程序启动时加载到内存中。这意味着它们不能被修改，并且必须使用const char*或const char[]类型的指针来引用它们。&lt;/p>
&lt;p>由于字符串字面量是常量，因此它们可以在编译时进行优化。例如，如果两个字符串字面量具有相同的值，则它们可能会共享存储空间，从而减少程序的内存占用。&lt;/p>
&lt;p>需要注意的是，如果在程序中使用大量的字符串字面量，则可能会增加程序的内存占用。为了减少内存使用量，应该考虑使用动态分配内存来存储字符串，或者使用字符串流等工具来动态构建字符串。&lt;/p></description></item><item><title>C++中的引用</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E5%BC%95%E7%94%A8-052dd015f0c7427e8a99bfe77b873d1b/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E5%BC%95%E7%94%A8-052dd015f0c7427e8a99bfe77b873d1b/</guid><description>&lt;p>在C++中，引用是一种将变量绑定到另一个变量的方法。引用可以被视为变量的别名，它们与指针有些相似，但有一些重要的区别。&lt;/p>
&lt;p>引用是在定义时初始化的，一旦初始化完成，就不能再将其绑定到另一个变量或修改它所绑定的变量。与之相反的是，指针可以被重新赋值来指向不同的变量。&lt;/p>
&lt;p>另一个重要的区别是，引用不能为null，而指针可以为null。这意味着引用不需要在使用之前进行空指针检查，从而减少了代码的复杂性和错误的可能性。&lt;/p>
&lt;p>引用通常用于将函数的参数传递给其他函数。通过使用引用作为参数，可以避免将大型对象进行复制，从而提高程序的性能。同样，引用也可以用于从函数中返回值，而无需创建新的对象。&lt;/p>
&lt;p>在C++中，引用是非常有用的工具，可以用来编写高效且易于阅读的代码。理解引用的概念和用法对于成为C++开发人员是至关重要的一步。&lt;/p>
&lt;p>引用在C++中可以理解成一种语法糖，编译器对其不进行编译，只停留在代码文本层面，仅代表了一个变量的另一个名字，可以在程序员编码时更加高效，代码保持干净&lt;/p>
&lt;p>以下是引用的一个例子：&lt;/p>
&lt;pre tabindex="0">&lt;code>#include &amp;lt;iostream&amp;gt;
using namespace std;
void swap(int&amp;amp; x, int&amp;amp; y) {
int temp = x;
x = y;
y = temp;
}
int main() {
int a = 5;
int b = 10;
cout &amp;lt;&amp;lt; &amp;#34;Before swap, a = &amp;#34; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; &amp;#34; and b = &amp;#34; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;
// Pass variables by reference to swap function
swap(a, b);
cout &amp;lt;&amp;lt; &amp;#34;After swap, a = &amp;#34; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; &amp;#34; and b = &amp;#34; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;
return 0;
}
&lt;/code>&lt;/pre>&lt;p>在这个例子中，我们定义了一个&lt;code>swap&lt;/code>函数，它接受两个整数的引用作为参数，并交换它们的值。在&lt;code>main&lt;/code>函数中，我们声明了两个整数变量&lt;code>a&lt;/code>和&lt;code>b&lt;/code>，并将它们传递给&lt;code>swap&lt;/code>函数。由于我们使用了引用参数，&lt;code>swap&lt;/code>函数可以直接修改变量&lt;code>a&lt;/code>和&lt;code>b&lt;/code>的值，而不需要创建额外的变量或进行复制。这样可以提高程序的性能，并减少内存使用量。省的return， 带来内存的开销。&lt;/p></description></item><item><title>C++中的指针</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E6%8C%87%E9%92%88-9b510564ca8d4ad3b860d216573eb30b/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E6%8C%87%E9%92%88-9b510564ca8d4ad3b860d216573eb30b/</guid><description>&lt;p>在C++中，指针是一种非常强大的数据类型。指针是一种变量，它存储了一个内存地址，该内存地址指向另一个变量。指针可以用于访问和操作存储在内存中的数据。&lt;/p>
&lt;p>指针变量可以通过在变量名前面加上星号（*）来声明。例如，下面的代码声明了一个名为 *ptr 的整数类型指针变量：&lt;/p>
&lt;pre tabindex="0">&lt;code>int* ptr;
&lt;/code>&lt;/pre>&lt;p>在上面的代码中，星号（*）表示 ptr 是一个指向整数类型的指针变量。指针变量在声明时必须指定指针类型，因为不同类型的指针可以存储不同类型的数据。&lt;/p>
&lt;p>指针变量可以使用“&amp;amp;”运算符获取变量的地址。例如，下面的代码获取了整数变量 num 的地址，并将其存储在指针变量 ptr 中：&lt;/p>
&lt;pre tabindex="0">&lt;code>int num = 10;
int* ptr = &amp;amp;num;
&lt;/code>&lt;/pre>&lt;p>在上面的代码中，ptr 指向 num 变量的地址。&lt;/p>
&lt;p>使用指针可以访问指针所指向的变量。例如，下面的代码使用指针访问 num 变量，并将其值增加了 1：&lt;/p>
&lt;pre tabindex="0">&lt;code>*ptr = *ptr + 1;
&lt;/code>&lt;/pre>&lt;p>在上面的代码中，星号（*）表示访问指针所指向的变量，将其值加 1。&lt;/p>
&lt;p>指针还可以用于动态内存分配。通过使用 new 运算符，可以在程序运行时动态地分配内存。例如，下面的代码分配了一个整数类型的内存块，并将其地址存储在指针变量 ptr 中：&lt;/p>
&lt;pre tabindex="0">&lt;code>int* ptr = new int;
&lt;/code>&lt;/pre>&lt;p>在上面的代码中，new 运算符分配了一个整数类型的内存块，并返回其地址，该地址被存储在指针变量 ptr 中。&lt;/p>
&lt;p>指针还可以用于访问数组中的元素。例如，下面的代码声明了一个指向整数类型的指针变量，然后使用该指针访问数组中的元素：&lt;/p>
&lt;pre tabindex="0">&lt;code>int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr; // ptr 指向数组的第一个元素
for(int i = 0; i &amp;lt; 5; i++) {
cout &amp;lt;&amp;lt; *ptr &amp;lt;&amp;lt; endl;
ptr++;
}
&lt;/code>&lt;/pre>&lt;p>在上面的代码中，ptr 指向数组的第一个元素。然后，使用指针访问数组中的每个元素，并将其打印到控制台上。&lt;/p>
&lt;p>指针是一种非常强大的数据类型，在 C++ 中具有广泛的应用。了解指针的工作原理和使用方法是编写高效程序的重要一步。&lt;/p></description></item><item><title>C++中的接口（纯虚函数）</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E6%8E%A5%E5%8F%A3%E7%BA%AF%E8%99%9A%E5%87%BD%E6%95%B0-d02581428abd4cdead1da2c4b780467c/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E6%8E%A5%E5%8F%A3%E7%BA%AF%E8%99%9A%E5%87%BD%E6%95%B0-d02581428abd4cdead1da2c4b780467c/</guid><description>&lt;p>在C++中，接口通常用纯虚函数的形式来实现。纯虚函数是一种没有实现的虚函数，其定义需要在派生类中完成。接口中只有纯虚函数，没有数据成员和函数定义，因此派生类必须实现接口中定义的所有纯虚函数，否则编译器会报错。&lt;/p>
&lt;p>接口可以用于实现多态性，一个类可以继承多个接口，从而具有多个行为。例如，一个图形界面程序可以定义一个绘制图形的接口和一个处理用户输入的接口，不同的图形对象可以继承不同的接口，以实现不同的行为。&lt;/p>
&lt;p>以下是一个简单的接口示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Shape&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">virtual&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="n">draw&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Circle&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="k">public&lt;/span> &lt;span class="n">Shape&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">draw&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 绘制圆形
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Square&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="k">public&lt;/span> &lt;span class="n">Shape&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">draw&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 绘制正方形
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在这个示例中，Shape类是一个接口，定义了一个纯虚函数draw()。Circle和Square类都继承了Shape类，并实现了draw()函数来绘制不同的形状。&lt;/p>
&lt;p>接口的使用可以使代码更加模块化和可扩展，同时也可以提高代码的可读性和可维护性。但是，过多的接口也可能会使代码过于复杂，因此在设计时需要权衡利弊，尽量避免过多的接口设计。&lt;/p>
&lt;blockquote>
&lt;p>其实C++没有&lt;code>interface&lt;/code> 关键字&lt;/p>
&lt;p>在C++中，接口的实现通常采用纯虚函数的形式。纯虚函数是没有实现的虚函数，其定义需要在派生类中完成。接口中没有数据成员和函数定义，只有纯虚函数，因此派生类必须实现接口中定义的所有纯虚函数。接口可以实现多态性，一个类可以继承多个接口，以具有不同的行为。在设计时需要权衡利弊，尽量避免过多的接口设计。&lt;/p>
&lt;/blockquote>
&lt;p>下面是一个关于接口多态的例子：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Shape.h
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">Shape&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">virtual&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="n">draw&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Colorful.h
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">Colorful&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">virtual&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="n">setColor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">g&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Circle.h
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">Circle&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="k">public&lt;/span> &lt;span class="n">Shape&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">public&lt;/span> &lt;span class="n">Colorful&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">draw&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="k">override&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 绘制圆形
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">setColor&lt;/span> &lt;span class="nf">override&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">g&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 设置圆形的颜色
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Square.h
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">Square&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="k">public&lt;/span> &lt;span class="n">Shape&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">public&lt;/span> &lt;span class="n">Colorful&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">draw&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="k">override&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 绘制正方形
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">setColor&lt;/span> &lt;span class="k">override&lt;/span> &lt;span class="o">****&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">g&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 设置正方形的颜色
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// main.cpp
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Shape&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">shapes&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shapes&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Circle&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shapes&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Square&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shapes&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">draw&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Colorful&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">colorful&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">dynamic_cast&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Colorful&lt;/span>&lt;span class="o">*&amp;gt;&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">shapes&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">colorful&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="k">nullptr&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">colorful&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">setColor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">255&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在这个例子中，Shape类和Colorful类都是接口，Circle和Square类都继承了Shape类和Colorful类，并实现了draw()函数和setColor()函数来绘制不同的形状和设置不同的颜色。在main函数中，创建了一个Shape指针数组shapes，其中存放了一个Circle对象和一个Square对象。通过循环依次调用它们的draw()函数，并通过dynamic_cast将它们转换成Colorful指针，最后通过setColor()函数设置它们的颜色。&lt;/p>
&lt;p>这个例子展示了接口的多态特性，通过继承不同的接口，一个类可以具有多个行为，可以在不同的情况下调用不同的函数实现不同的功能。&lt;/p>
&lt;h1 id="多态接收一个接口作为参数">多态：接收一个接口作为参数&lt;/h1>
&lt;p>在C++中，多态可以通过接收一个接口作为参数来实现。例如，一个函数可以接收一个Shape接口作为参数，从而可以接收任意实现了Shape接口的类的对象。这样，函数就可以在&lt;strong>不知道具体对象类型的情况下调用对象的函数&lt;/strong>。&lt;/p>
&lt;p>以下是一个简单的例子：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">drawShape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Shape&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">shape&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shape&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">draw&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Circle&lt;/span> &lt;span class="n">circle&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Square&lt;/span> &lt;span class="n">square&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">drawShape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">circle&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">drawShape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">square&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在这个例子中，drawShape()函数接收一个Shape接口作为参数，并调用它的draw()函数来绘制图形。在main函数中，创建了一个Circle对象和一个Square对象，并将它们的地址传递给drawShape()函数。由于Circle和Square都继承了Shape接口并实现了它的draw()函数，因此可以成功地调用它们的draw()函数来绘制图形。&lt;/p>
&lt;p>多态可以使代码更加灵活和可扩展，同时也可以提高代码的可读性和可维护性。但是，过多的多态也可能会使代码过于复杂，因此在设计时需要权衡利弊，尽量避免过多的多态设计。&lt;/p></description></item><item><title>C++中的数组</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E6%95%B0%E7%BB%84-49ee11cae6c64590ac3b32234d9905c3/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E6%95%B0%E7%BB%84-49ee11cae6c64590ac3b32234d9905c3/</guid><description>&lt;p>数组是一种可以保存一系列相同类型数据的数据结构。在C++中，数组是一种容器，它可以存储一组固定大小的相同类型元素。数组中的每个元素都可以通过索引访问，索引从0开始，最大索引为数组大小减一。&lt;/p>
&lt;p>在C++中，声明一个数组需要指定数组的类型、名称和大小。例如，以下代码声明了一个名为&lt;code>myArray&lt;/code>的整数类型数组，大小为5：&lt;/p>
&lt;pre tabindex="0">&lt;code>int myArray[5];
&lt;/code>&lt;/pre>&lt;p>数组元素的访问方式是通过数组名称和索引。例如，要访问数组&lt;code>myArray&lt;/code>的第一个元素，可以使用以下代码：&lt;/p>
&lt;pre tabindex="0">&lt;code>int x = myArray[0];
&lt;/code>&lt;/pre>&lt;p>在C++中，数组的大小必须是一个常量表达式，因此不能使用变量来定义数组的大小。但是，可以使用&lt;code>const&lt;/code>关键字来定义一个常量，然后将其用作数组的大小。例如，以下代码定义了一个名为&lt;code>SIZE&lt;/code>的常量，并将其用作数组&lt;code>myArray&lt;/code>的大小：&lt;/p>
&lt;pre tabindex="0">&lt;code>const int SIZE = 5;
int myArray[SIZE];
&lt;/code>&lt;/pre>&lt;p>在C++中，还可以使用循环来遍历数组中的所有元素。例如，以下代码使用for循环遍历数组&lt;code>myArray&lt;/code>中的所有元素：&lt;/p>
&lt;pre tabindex="0">&lt;code>for(int i = 0; i &amp;lt; SIZE; i++) {
int x = myArray[i];
// 在这里使用元素值
}
&lt;/code>&lt;/pre>&lt;p>总之，在C++中，数组是一种非常有用的数据结构，它可以容纳一系列相同类型的元素，并允许通过索引访问这些元素。声明一个数组需要指定数组的类型、名称和大小，然后可以使用索引访问数组中的元素。可以使用常量表达式来定义数组的大小，并可以使用循环遍历数组中的所有元素。&lt;/p>
&lt;h1 id="在堆上创建数组">在堆上创建数组&lt;/h1>
&lt;p>在堆上创建数组需要使用&lt;code>new&lt;/code>运算符。例如，以下代码创建了一个大小为5的整数类型数组：&lt;/p>
&lt;pre tabindex="0">&lt;code>int* myArray = new int[5];
&lt;/code>&lt;/pre>&lt;p>在动态创建数组后，可以使用与静态数组相同的语法访问和操作数组元素。在完成使用数组后，必须使用&lt;code>delete[]&lt;/code>运算符释放动态分配的内存。例如，以下代码释放先前创建的动态数组：&lt;/p>
&lt;pre tabindex="0">&lt;code>delete[] myArray;
&lt;/code>&lt;/pre>&lt;p>总之，在C++中，可以使用&lt;code>new&lt;/code>运算符在堆上动态创建数组。创建数组后，可以使用与静态数组相同的语法访问和操作数组元素。在完成使用数组后，必须使用&lt;code>delete[]&lt;/code>运算符释放动态分配的内存。&lt;/p>
&lt;h1 id="c11中的数组">C++11中的数组&lt;/h1>
&lt;p>在C++11中，引入了一个名为&lt;code>array&lt;/code>的标准数组容器。&lt;code>array&lt;/code>容器与静态数组类似，但具有更好的类型安全性和迭代器支持。例如，以下代码声明了一个名为&lt;code>myArray&lt;/code>的整数类型&lt;code>array&lt;/code>，大小为5：&lt;/p>
&lt;pre tabindex="0">&lt;code>#include &amp;lt;array&amp;gt;
std::array&amp;lt;int, 5&amp;gt; myArray;
&lt;/code>&lt;/pre>&lt;p>可以使用&lt;code>at()&lt;/code>成员函数或&lt;code>[]&lt;/code>运算符来访问&lt;code>array&lt;/code>容器中的元素。例如，以下代码访问&lt;code>myArray&lt;/code>的第一个元素：&lt;/p>
&lt;pre tabindex="0">&lt;code>int x = myArray.at(0); // 或者 myArray[0];
&lt;/code>&lt;/pre>&lt;p>&lt;code>array&lt;/code>容器还具有其他功能，例如&lt;code>size()&lt;/code>成员函数可以用于获取数组的大小，&lt;code>fill()&lt;/code>成员函数可以用于将所有元素设置为指定值，&lt;code>begin()&lt;/code>和&lt;code>end()&lt;/code>成员函数可以用于迭代数组中的所有元素。&lt;/p>
&lt;p>总之，在C++11中，可以使用&lt;code>array&lt;/code>容器代替静态数组。&lt;code>array&lt;/code>容器提供了更好的类型安全性和迭代器支持，并具有许多有用的成员函数。&lt;/p></description></item><item><title>C++中的智能指针</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E6%99%BA%E8%83%BD%E6%8C%87%E9%92%88-376fa1bb49634219b9bdc5e8a5bd830a/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E6%99%BA%E8%83%BD%E6%8C%87%E9%92%88-376fa1bb49634219b9bdc5e8a5bd830a/</guid><description>&lt;p>在 C++ 中，指针是一种非常有用的数据类型，但是它们也经常引起内存泄漏和悬空指针等问题。智能指针是一种特殊的指针，它能够自动管理内存，帮助我们避免这些常见的问题。&lt;/p>
&lt;p>智能指针是一个对象，它的行为类似于指针，但是它还有一些额外的功能。智能指针可以自动地跟踪对象的生命周期，并在不再需要时释放内存。这种自动化的内存管理使得代码更加健壮和可靠。&lt;/p>
&lt;p>C++ 有两种内置的智能指针类型：shared_ptr 和 unique_ptr。shared_ptr 可以跟踪多个指向同一对象的指针，而 unique_ptr 只能有一个指针指向一个对象。shared_ptr 使用引用计数来管理内存，unique_ptr 管理独占所有权。&lt;/p>
&lt;p>智能指针的使用非常简单。只需要声明一个智能指针对象，并将其初始化为指向对象的指针。智能指针将负责管理内存，即使在函数返回或抛出异常时也能确保内存被正确释放。&lt;/p>
&lt;p>智能指针是一种非常强大的工具，它可以帮助我们编写更加健壮和可靠的 C++ 代码。在编写 C++ 程序时，我们应该尽可能地使用智能指针来管理内存，以避免内存泄漏和悬空指针等问题。&lt;/p>
&lt;p>例如，我们可以使用智能指针来管理一个动态分配的对象：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;memory&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">MyClass&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">MyClass&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;MyClass constructed&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">~&lt;/span>&lt;span class="n">MyClass&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;MyClass destructed&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="nf">Print&lt;/span>&lt;span class="p">(){}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">shared_ptr&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">MyClass&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">myClassPtr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">new&lt;/span> &lt;span class="n">MyClass&lt;/span>&lt;span class="p">());&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// do something with myClassPtr
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在这个例子中，我们使用 shared_ptr 来管理一个动态分配的 MyClass 对象。当 myClassPtr 超出作用域时，它会自动释放 MyClass 对象的内存。这种自动化的内存管理使得代码更加健壮和可靠。&lt;/p></description></item><item><title>C++中的构造函数</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0-4dfd196faf5f4b809efbd654fffb029a/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0-4dfd196faf5f4b809efbd654fffb029a/</guid><description>&lt;h1 id="为什么需要构造函数">为什么需要构造函数&lt;/h1>
&lt;p>构造函数是一种特殊的函数，用于在创建对象时初始化对象的成员变量。它们在对象创建时自动调用，因此它们很有用，可以确保在使用对象之前对象已经被正确地初始化。&lt;/p>
&lt;p>构造函数还可以用来设置默认值、分配内存和执行其他必要的初始化步骤，以确保对象能够正常工作。因此，它们是面向对象编程中不可或缺的一部分。&lt;/p>
&lt;p>主要是初始化很有用&lt;/p>
&lt;p>例如，以下是一个简单的类定义，它包含一个构造函数来初始化一个整数成员变量：&lt;/p>
&lt;pre tabindex="0">&lt;code>#include &amp;lt;iostream&amp;gt;
class MyClass {
public:
int myInt;
MyClass(int x) {
myInt = x;
}
};
int main() {
MyClass obj(42);
std::cout &amp;lt;&amp;lt; obj.myInt &amp;lt;&amp;lt; std::endl;
return 0;
}
&lt;/code>&lt;/pre>&lt;p>在这个例子中，我们定义了一个名为MyClass的类，它有一个整数成员变量myInt和一个构造函数，该函数将传递的值分配给myInt。在创建对象时，构造函数将自动调用，从而初始化myInt。在这个例子中，我们创建了一个名为obj的MyClass对象，并将值42传递给构造函数。当我们打印obj.myInt时，将输出42。&lt;/p>
&lt;h1 id="默认构造函数">默认构造函数&lt;/h1>
&lt;p>默认构造函数是指一个类的构造函数，如果没有显式定义，编译器就会自动提供。默认构造函数没有参数，它的主要作用是初始化对象的成员变量，将它们设置为默认值。&lt;/p>
&lt;p>在C++中，如果定义了带参数的构造函数，编译器就不会自动提供默认构造函数。因此，在需要使用默认构造函数的情况下，必须显式定义它。&lt;/p>
&lt;p>例如，以下是一个简单的类定义，它包含一个默认构造函数：&lt;/p>
&lt;pre tabindex="0">&lt;code>#include &amp;lt;iostream&amp;gt;
class MyClass {
public:
int myInt;
MyClass() {
myInt = 0;
}
};
int main() {
MyClass obj;
std::cout &amp;lt;&amp;lt; obj.myInt &amp;lt;&amp;lt; std::endl;
return 0;
}
&lt;/code>&lt;/pre>&lt;p>在这个例子中，我们定义了一个名为MyClass的类，它有一个整数成员变量myInt和一个默认构造函数，该函数将myInt设置为0。在创建对象时，构造函数将自动调用，从而初始化myInt。在这个例子中，我们创建了一个名为obj的MyClass对象，并打印了它的myInt成员变量，它的默认值为0。&lt;/p>
&lt;h1 id="怎样隐藏构造函数">怎样隐藏构造函数&lt;/h1>
&lt;p>可以使用访问修饰符来隐藏构造函数，使它们无法从外部访问。例如，将构造函数声明为private将防止在类外部创建对象，但允许类内部的其他函数创建对象。这种技术被称为单例模式，它可以确保只有一个类的实例存在于任何给定的时间。&lt;/p>
&lt;p>例如，我们可以创建一个名为Singleton的类，它有一个私有的构造函数和一个公共的静态方法GetInstance，用于获取类的唯一实例。在GetInstance方法中，我们使用一个静态的Singleton指针变量来保存类的唯一实例，并在第一次调用GetInstance时创建它。以后的每次调用都将返回相同的实例，因此只有一个Singleton实例存在于任何给定的时间。&lt;/p>
&lt;p>以下是Singleton类的示例代码：&lt;/p>
&lt;pre tabindex="0">&lt;code>#include &amp;lt;iostream&amp;gt;
class Singleton {
private:
static Singleton* instance;
// 私有构造函数
Singleton() {}
public:
// 静态方法，用于获取唯一实例
static Singleton* GetInstance() {
if (!instance) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr;
int main() {
Singleton* obj1 = Singleton::GetInstance();
Singleton* obj2 = Singleton::GetInstance();
// obj1和obj2是同一个对象
std::cout &amp;lt;&amp;lt; obj1 &amp;lt;&amp;lt; std::endl;
std::cout &amp;lt;&amp;lt; obj2 &amp;lt;&amp;lt; std::endl;
return 0;
}
&lt;/code>&lt;/pre>&lt;p>在这个例子中，我们定义了一个名为Singleton的类，它有一个私有的构造函数和一个公共的静态方法GetInstance。我们还定义了一个静态的Singleton指针变量instance，用于保存类的唯一实例。&lt;/p>
&lt;p>在main函数中，我们首先使用GetInstance方法获取一个名为obj1的Singleton实例，然后再次调用GetInstance方法获取一个名为obj2的Singleton实例。由于GetInstance方法始终返回相同的实例，因此obj1和obj2是相同的对象。我们打印它们的地址，以证明它们是相同的对象。&lt;/p>
&lt;h1 id="析构函数">析构函数&lt;/h1>
&lt;p>除了构造函数外，C++中还有一个特殊的函数叫做析构函数。析构函数在对象被销毁时自动调用，用于释放对象使用的资源（例如内存）。&lt;/p>
&lt;p>在C++中，析构函数的名称是在类名称前面加上一个波浪号（~），例如：&lt;/p>
&lt;pre tabindex="0">&lt;code>class MyClass {
public:
~MyClass() {
// 析构函数代码
}
};
&lt;/code>&lt;/pre>&lt;p>在这个例子中，我们定义了一个名为MyClass的类，它有一个析构函数。当对象被销毁时，析构函数将自动调用，执行代码以释放使用的资源。&lt;/p>
&lt;h1 id="移动构造函数和移动赋值运算符">移动构造函数和移动赋值运算符&lt;/h1>
&lt;p>移动构造函数和移动赋值运算符是C++11引入的新功能，用于提高代码的效率。它们允许将一个对象的资源（例如内存）移动到另一个对象中，而不是进行复制。&lt;/p>
&lt;p>移动构造函数在创建新对象时从现有对象中“窃取”资源。移动赋值运算符在将一个对象的值赋给另一个对象时执行相同的操作。&lt;/p>
&lt;p>例如，以下是一个简单的类定义，其中包含一个移动构造函数和一个移动赋值运算符：&lt;/p>
&lt;pre tabindex="0">&lt;code>#include &amp;lt;iostream&amp;gt;
class MyClass {
public:
int* myArray;
int size;
// 移动构造函数
MyClass(MyClass&amp;amp;&amp;amp; other) {
myArray = other.myArray;
size = other.size;
other.myArray = nullptr;
other.size = 0;
}
// 移动赋值运算符
MyClass&amp;amp; operator=(MyClass&amp;amp;&amp;amp; other) {
if (this != &amp;amp;other) {
delete[] myArray;
myArray = other.myArray;
size = other.size;
other.myArray = nullptr;
other.size = 0;
}
return *this;
}
// 构造函数
MyClass(int s) {
myArray = new int[s];
size = s;
}
// 析构函数
~MyClass() {
delete[] myArray;
}
};
int main() {
MyClass obj1(10); // 创建一个对象
MyClass obj2(std::move(obj1)); // 使用移动构造函数创建一个新对象
obj1 = MyClass(20); // 使用移动赋值运算符将一个临时对象的值赋给一个对象
return 0;
}
&lt;/code>&lt;/pre>&lt;p>在这个例子中，我们定义了一个名为MyClass的类，它有一个整数数组成员变量myArray和一个整数成员变量size。我们还定义了一个移动构造函数、一个移动赋值运算符、一个构造函数和一个析构函数。&lt;/p>
&lt;p>在main函数中，我们首先创建了一个名为obj1的MyClass对象，然后使用移动构造函数创建了一个名为obj2的新对象。接下来，我们使用移动赋值运算符将一个临时的MyClass对象的值赋给obj1。这些操作允许我们“移动”资源，而不是进行复制，从而提高了代码的效率。&lt;/p></description></item><item><title>C++中的析构函数</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E6%9E%90%E6%9E%84%E5%87%BD%E6%95%B0-62fd40fc08b04b85b2fa8ca5d5e14ade/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E6%9E%90%E6%9E%84%E5%87%BD%E6%95%B0-62fd40fc08b04b85b2fa8ca5d5e14ade/</guid><description>&lt;p>在C++中，析构函数是一种特殊类型的函数，它在对象生命周期结束时被调用。析构函数的作用是清理对象在其生命周期中使用的资源，例如动态分配的内存和打开的文件等。因此，它是C++中重要的特性之一。&lt;/p>
&lt;p>在类定义中，析构函数的名称是与类名相同，前面加上一个波浪号(~)。如下所示：&lt;/p>
&lt;pre tabindex="0">&lt;code>class MyClass {
public:
// 构造函数
MyClass() {
// 对象创建时执行
}
// 析构函数
~MyClass() {
// 对象销毁时执行
}
};
&lt;/code>&lt;/pre>&lt;p>当对象超出其作用域或被显式地删除时，析构函数将被调用。例如：&lt;/p>
&lt;pre tabindex="0">&lt;code>int main() {
MyClass obj;
// 对象超出作用域
return 0;
}
或
int main() {
MyClass *ptr = new MyClass();
// 显式地删除对象
delete ptr;
return 0;
}
&lt;/code>&lt;/pre>&lt;p>当执行以上代码时，MyClass的析构函数将被自动调用，以便清理对象在其生命周期中使用的资源。&lt;/p>
&lt;p>需要注意的是，当一个对象被销毁时，它的成员变量和基类也将被销毁。因此，在析构函数中，通常需要对所有成员变量和基类进行清理操作。&lt;/p>
&lt;p>总之，析构函数是C++中非常重要的特性之一，它允许程序员在对象生命周期结束时清理对象所使用的资源。在编写C++程序时，需要了解析构函数的使用和语法，以便正确地管理程序所使用的资源。&lt;/p>
&lt;p>不推荐手动调用析构函数&lt;/p></description></item><item><title>C++中的枚举</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E6%9E%9A%E4%B8%BE-c789b3b413054bb5a75e493dfff9b88e/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E6%9E%9A%E4%B8%BE-c789b3b413054bb5a75e493dfff9b88e/</guid><description>&lt;p>在C++中，枚举是一种用户自定义的数据类型，它允许程序员定义一组命名的常量。这些常量可以被当作整数使用，并且在程序中具有固定的值。&lt;/p>
&lt;p>在C++中，要定义一个枚举，需要使用关键字&amp;rsquo;enum&amp;rsquo;。下面是一个例子：&lt;/p>
&lt;pre tabindex="0">&lt;code>enum Season {Spring, Summer, Fall, Winter};
&lt;/code>&lt;/pre>&lt;p>在这个例子中，我们定义了一个名为&amp;rsquo;Season&amp;rsquo;的枚举类型，其中包含了四个常量：Spring，Summer，Fall和Winter。这些常量的值分别为0，1，2和3。如果需要改变这些常量的值，可以显式地指定它们的值，如下所示：&lt;/p>
&lt;pre tabindex="0">&lt;code>enum Season {Spring=1, Summer=2, Fall=3, Winter=4};
&lt;/code>&lt;/pre>&lt;p>在这个例子中，我们将Spring的值指定为1，Summer的值指定为2，依此类推。&lt;/p>
&lt;p>枚举常量的值可以在程序中使用，例如：&lt;/p>
&lt;pre tabindex="0">&lt;code>Season currentSeason = Summer;
if (currentSeason == Summer) {
cout &amp;lt;&amp;lt; &amp;#34;It&amp;#39;s Summer!&amp;#34; &amp;lt;&amp;lt; endl;
}
&lt;/code>&lt;/pre>&lt;p>在这个例子中，我们将currentSeason的值设为Summer，然后检查它是否等于Summer。如果是，就输出&amp;quot;It&amp;rsquo;s Summer!&amp;quot;。&lt;/p>
&lt;p>枚举类型还可以用于switch语句，例如：&lt;/p>
&lt;pre tabindex="0">&lt;code>switch(currentSeason) {
case Spring:
cout &amp;lt;&amp;lt; &amp;#34;It&amp;#39;s Spring!&amp;#34; &amp;lt;&amp;lt; endl;
break;
case Summer:
cout &amp;lt;&amp;lt; &amp;#34;It&amp;#39;s Summer!&amp;#34; &amp;lt;&amp;lt; endl;
break;
case Fall:
cout &amp;lt;&amp;lt; &amp;#34;It&amp;#39;s Fall!&amp;#34; &amp;lt;&amp;lt; endl;
break;
case Winter:
cout &amp;lt;&amp;lt; &amp;#34;It&amp;#39;s Winter!&amp;#34; &amp;lt;&amp;lt; endl;
break;
}
&lt;/code>&lt;/pre>&lt;p>在这个例子中，我们使用switch语句检查currentSeason的值，并根据其值输出相应的信息。&lt;/p>
&lt;p>总之，枚举是C++中一种非常有用的数据类型，它可以帮助我们定义一组常量，并在程序中使用它们。&lt;/p></description></item><item><title>C++中的继承</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E7%BB%A7%E6%89%BF-b70e00c1604e4b2e8a25eb4a67c1fd8e/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E7%BB%A7%E6%89%BF-b70e00c1604e4b2e8a25eb4a67c1fd8e/</guid><description>&lt;h1 id="c中的继承">C++中的继承&lt;/h1>
&lt;h1 id="c中的继承-1">C++中的继承&lt;/h1>
&lt;p>继承是面向对象编程中的一个重要概念，C++作为一门面向对象编程语言，支持类的继承。子类可以继承父类的属性和方法，从而避免了代码的重复编写，提高了代码的可重用性。&lt;/p>
&lt;p>C++中的继承有以下几种类型：&lt;/p>
&lt;h2 id="公有继承public-inheritance">公有继承（public inheritance）&lt;/h2>
&lt;p>公有继承是指子类继承父类的公有成员，父类的私有成员和保护成员不能被子类访问。&lt;/p>
&lt;h2 id="私有继承private-inheritance">私有继承（private inheritance）&lt;/h2>
&lt;p>私有继承是指子类继承父类的私有成员和保护成员，但不能访问父类的公有成员。私有继承主要用于实现“has-a”关系。&lt;/p>
&lt;h2 id="保护继承protected-inheritance">保护继承（protected inheritance）&lt;/h2>
&lt;p>保护继承是指子类继承父类的保护成员和公有成员，但不能访问父类的私有成员。保护继承主要用于实现“is-a”关系。&lt;/p>
&lt;p>在C++中，子类可以通过继承的方式获得父类的所有成员，包括数据成员和成员函数。在子类中可以通过父类名::成员名的方式来访问父类的成员。同时，C++中还支持虚继承和多重继承等高级特性，可以更加灵活地设计类的继承关系。&lt;/p>
&lt;p>继承是C++面向对象编程中的重要概念，掌握继承的原理和用法对于设计高质量的面向对象程序非常重要。&lt;/p>
&lt;p>例如，我们有一个 &lt;code>Animal&lt;/code> 类，里面包含了 &lt;code>name&lt;/code> 和 &lt;code>age&lt;/code> 两个属性以及 &lt;code>eat()&lt;/code> 和 &lt;code>sleep()&lt;/code> 两个方法。现在，我们需要实现一个 &lt;code>Dog&lt;/code> 类，它继承自 &lt;code>Animal&lt;/code> 类，并且还有一个 &lt;code>bark()&lt;/code> 方法。我们可以这样定义 &lt;code>Dog&lt;/code> 类：&lt;/p>
&lt;pre tabindex="0">&lt;code>class Animal {
public:
string name;
int age;
void eat() {
cout &amp;lt;&amp;lt; &amp;#34;I am eating.&amp;#34; &amp;lt;&amp;lt; endl;
}
void sleep() {
cout &amp;lt;&amp;lt; &amp;#34;I am sleeping.&amp;#34; &amp;lt;&amp;lt; endl;
}
};
&lt;/code>&lt;/pre>&lt;pre tabindex="0">&lt;code>class Dog : public Animal {
public:
void bark() {
cout &amp;lt;&amp;lt; &amp;#34;Woof!&amp;#34; &amp;lt;&amp;lt; endl;
}
};
&lt;/code>&lt;/pre>&lt;p>这样，&lt;code>Dog&lt;/code> 类就继承了 &lt;code>Animal&lt;/code> 类的属性和方法，并且还新增了一个 &lt;code>bark()&lt;/code> 方法。我们可以这样使用 &lt;code>Dog&lt;/code> 类：&lt;/p>
&lt;pre tabindex="0">&lt;code>Dog myDog;
myDog.name = &amp;#34;Fido&amp;#34;;
myDog.age = 3;
myDog.eat();
myDog.sleep();
myDog.bark();
&lt;/code>&lt;/pre>&lt;p>这样就可以创建一个 &lt;code>Dog&lt;/code> 对象，并且调用它的属性和方法了。&lt;/p>
&lt;p>在C++中，继承关系会影响成员的可见性。具体来说，成员的可见性取决于它在父类中的访问权限以及继承方式。&lt;/p>
&lt;p>如果使用公有继承，在子类中可以访问父类的公有成员和受保护的成员，但不能访问父类的私有成员。如果使用私有继承，在子类中可以访问父类的受保护的成员和私有成员，但不能访问父类的公有成员。如果使用保护继承，在子类中可以访问父类的公有成员和受保护的成员，但不能访问父类的私有成员。&lt;/p>
&lt;p>需要注意的是，在子类中可以通过父类名::成员名的方式来访问父类的成员，不受继承方式的限制。此外，如果在子类中定义了与父类同名的成员函数或成员变量，则会覆盖父类的同名成员，这被称为函数重载或变量隐藏。&lt;/p>
&lt;p>继承是C++面向对象编程中的重要概念，掌握继承的原理和用法对于设计高质量的面向对象程序非常重要。&lt;/p></description></item><item><title>C++虚函数</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E8%99%9A%E5%87%BD%E6%95%B0-e15af8370b37486d9ff31dea7793c5b9/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/c++%E4%B8%AD%E7%9A%84%E8%99%9A%E5%87%BD%E6%95%B0-e15af8370b37486d9ff31dea7793c5b9/</guid><description>&lt;p>C++中的虚函数是一种在运行时动态绑定的机制。虚函数使得C++中的多态性成为可能，因为它允许在运行时选择正确的函数实现。&lt;/p>
&lt;p>在C++中，虚函数是通过在基类函数声明前面添加关键字“virtual”来声明的。当派生类继承该函数时，如果它重写了该函数并且在派生类函数声明前面也加上了“virtual”关键字，那么该函数就变成了虚函数。派生类中的虚函数实现将覆盖基类中的虚函数实现，从而实现了运行时多态性。&lt;/p>
&lt;p>虚函数的工作原理是通过虚函数表来实现的。每个包含虚函数的类都有一个指向虚函数表的指针，虚函数表是一个包含该类中虚函数指针的数组。当调用虚函数时，程序会查找对象的虚函数表，然后根据表中存储的函数指针调用正确的函数实现。&lt;/p>
&lt;p>虚函数在C++中的使用非常普遍，特别是在面向对象编程中。它使得代码更加模块化和可扩展，并且提高了代码的可维护性和可读性。&lt;/p>
&lt;p>总之，虚函数是C++中一种重要的机制，它允许在运行时动态绑定函数实现，从而实现多态性。对于任何想要在C++中编写高效且易于维护的代码的开发者来说，了解和掌握虚函数的使用是非常重要的。&lt;/p>
&lt;p>以下是一个虚函数的简单示例，演示了如何在派生类中重写基类中的虚函数：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Base&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">**&lt;/span>&lt;span class="k">virtual&lt;/span>&lt;span class="o">**&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="n">say_hello&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Hello from Base&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Derived&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="k">public&lt;/span> &lt;span class="n">Base&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">say_hello&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="k">override&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Hello from Derived&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Base&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">Derived&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">b&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">say_hello&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// 输出 &amp;#34;Hello from Derived&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">delete&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在这个例子中，我们有一个基类 &lt;code>Base&lt;/code>，它有一个名为 &lt;code>say_hello&lt;/code> 的虚函数。我们还有一个派生类 &lt;code>Derived&lt;/code>，它重写了 &lt;code>say_hello&lt;/code> 函数。在 &lt;code>main&lt;/code> 函数中，我们首先创建了一个 &lt;code>Derived&lt;/code> 类型的对象，然后将其赋值给一个指向基类的指针 &lt;code>b&lt;/code>。接下来，我们调用 &lt;code>b&lt;/code> 的 &lt;code>say_hello&lt;/code> 函数。由于 &lt;code>say_hello&lt;/code> 是虚函数，程序会在运行时选择正确的函数实现，即 &lt;code>Derived&lt;/code> 类中的 &lt;code>say_hello&lt;/code> 函数。因此，程序将输出 &amp;ldquo;Hello from Derived&amp;rdquo;。&lt;/p>
&lt;blockquote>
&lt;p>其实就是base class 里边有个函数可以在 sub class 里重写，给了个标记 virtual, 告诉编译器，生成 v表吧，为这个函数。这样如果它被重写了，你就可以指向正确的函数&lt;/p>
&lt;/blockquote>
&lt;h1 id="c11-override关键字">C++11 override关键字&lt;/h1>
&lt;p>C++11中加入了一个新的关键字 &lt;code>override&lt;/code>，用于表示派生类中的函数是重写了基类中的虚函数。使用 &lt;code>override&lt;/code> 可以帮助我们避免因为函数签名不一致而无法正确重写虚函数的问题。如果派生类中的函数没有正确重写基类中的虚函数，编译器将会报错。&lt;/p>
&lt;p>以下是使用 &lt;code>override&lt;/code> 关键字的示例：&lt;/p>
&lt;pre tabindex="0">&lt;code>#include &amp;lt;iostream&amp;gt;
class Base {
public:
virtual void say_hello() {
std::cout &amp;lt;&amp;lt; &amp;#34;Hello from Base&amp;#34; &amp;lt;&amp;lt; std::endl;
}
};
class Derived : public Base {
public:
void say_hello() override {
std::cout &amp;lt;&amp;lt; &amp;#34;Hello from Derived&amp;#34; &amp;lt;&amp;lt; std::endl;
}
// 如果这里不加 override 关键字，编译器将会报错
};
int main() {
Base* b = new Derived();
b-&amp;gt;say_hello(); // 输出 &amp;#34;Hello from Derived&amp;#34;
delete b;
return 0;
}
&lt;/code>&lt;/pre>&lt;p>在这个例子中，我们在 &lt;code>Derived&lt;/code> 类中重写了 &lt;code>say_hello&lt;/code> 函数，并使用了 &lt;code>override&lt;/code> 关键字。如果我们不加 &lt;code>override&lt;/code> 关键字，编译器将会报错。&lt;/p>
&lt;h1 id="虚函数相关的运行成本">虚函数相关的运行成本&lt;/h1>
&lt;p>虚函数的使用可能会带来一些额外的运行时开销。两个&lt;/p>
&lt;ol>
&lt;li>由于每个包含虚函数的类都需要一个指向&lt;strong>虚函数表的指针&lt;/strong>，这会增加对象的大小。&lt;/li>
&lt;li>此外，在调用虚函数时，程序需要查找对象的&lt;strong>虚函数表&lt;/strong>并调用正确的函数实现，这可能会导致一些性能损失。&lt;/li>
&lt;/ol>
&lt;p>然而，这些开销通常是可以接受的，并且通过合理的设计和实现可以最小化这些开销。在大多数情况下，虚函数的使用对于代码的可维护性和可扩展性来说是非常重要的，因此我们应该仔细考虑是否需要使用虚函数。&lt;/p></description></item><item><title>CPP</title><link>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/</link><pubDate>Thu, 02 Mar 2023 12:34:40 +0000</pubDate><guid>https://loloxwg.top/posts/cpp/cpp-0cfaab30bd8344c6aa29a581cb2d8ccf/</guid><description>&lt;p>C++ is a high-level, general-purpose programming language that was developed by Bjarne Stroustrup in 1983 as an extension of the C programming language. C++ provides support for object-oriented programming, generic programming, and low-level memory manipulation.&lt;/p>
&lt;p>One of the main advantages of C++ is its efficiency and performance. C++ code can be compiled into machine code, which makes it faster than other high-level programming languages. This makes it a popular choice for developing high-performance software such as video games, operating systems, and scientific simulations.&lt;/p>
&lt;p>Another advantage of C++ is its flexibility. It can be used for a wide range of applications, from desktop applications to mobile apps, and from large-scale enterprise systems to small-scale embedded systems.&lt;/p>
&lt;p>&lt;a href="CPP%200cfaab30bd8344c6aa29a581cb2d8ccf/C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E6%8C%87%E9%92%88%209b510564ca8d4ad3b860d216573eb30b.md">C++中的指针&lt;/a>&lt;/p>
&lt;p>&lt;a href="CPP%200cfaab30bd8344c6aa29a581cb2d8ccf/C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E5%BC%95%E7%94%A8%20052dd015f0c7427e8a99bfe77b873d1b.md">C++中的引用&lt;/a>&lt;/p>
&lt;p>&lt;a href="CPP%200cfaab30bd8344c6aa29a581cb2d8ccf/C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84static%20eb2478cbe8134fcf9c35f28028be93c5.md">C++中的static &lt;/a>&lt;/p>
&lt;p>&lt;a href="CPP%200cfaab30bd8344c6aa29a581cb2d8ccf/C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E6%9E%9A%E4%B8%BE%20c789b3b413054bb5a75e493dfff9b88e.md">C++中的枚举&lt;/a>&lt;/p>
&lt;p>&lt;a href="CPP%200cfaab30bd8344c6aa29a581cb2d8ccf/C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%204dfd196faf5f4b809efbd654fffb029a.md">C++中的构造函数&lt;/a>&lt;/p>
&lt;p>&lt;a href="CPP%200cfaab30bd8344c6aa29a581cb2d8ccf/C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E6%9E%90%E6%9E%84%E5%87%BD%E6%95%B0%2062fd40fc08b04b85b2fa8ca5d5e14ade.md">C++中的析构函数&lt;/a>&lt;/p>
&lt;p>&lt;a href="CPP%200cfaab30bd8344c6aa29a581cb2d8ccf/C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E7%BB%A7%E6%89%BF%20b70e00c1604e4b2e8a25eb4a67c1fd8e.md">C++中的继承&lt;/a>&lt;/p>
&lt;p>&lt;a href="CPP%200cfaab30bd8344c6aa29a581cb2d8ccf/C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E8%99%9A%E5%87%BD%E6%95%B0%20e15af8370b37486d9ff31dea7793c5b9.md">C++中的虚函数&lt;/a>&lt;/p>
&lt;p>&lt;a href="CPP%200cfaab30bd8344c6aa29a581cb2d8ccf/C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E6%8E%A5%E5%8F%A3%EF%BC%88%E7%BA%AF%E8%99%9A%E5%87%BD%E6%95%B0%EF%BC%89%20d02581428abd4cdead1da2c4b780467c.md">C++中的接口（纯虚函数）&lt;/a>&lt;/p>
&lt;p>&lt;a href="CPP%200cfaab30bd8344c6aa29a581cb2d8ccf/C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E5%8F%AF%E8%A7%81%E6%80%A7%200ae232d21aa34b14aacc7c41515ef775.md">C++中的可见性&lt;/a>&lt;/p>
&lt;p>&lt;a href="CPP%200cfaab30bd8344c6aa29a581cb2d8ccf/C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E6%95%B0%E7%BB%84%2049ee11cae6c64590ac3b32234d9905c3.md">C++中的数组&lt;/a>&lt;/p>
&lt;p>&lt;a href="CPP%200cfaab30bd8344c6aa29a581cb2d8ccf/C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%20c1aea693e5cc47d8a53110577af87660.md">C++中的字符串&lt;/a>&lt;/p>
&lt;p>&lt;a href="CPP%200cfaab30bd8344c6aa29a581cb2d8ccf/C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%AD%97%E9%9D%A2%E9%87%8F%200d677efe66d24fa48892844cda209126.md">C++中的字符串字面量&lt;/a>&lt;/p>
&lt;p>&lt;a href="CPP%200cfaab30bd8344c6aa29a581cb2d8ccf/C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84const%20f78cd58e7f3c44adac55620e8d3efa13.md">C++中的const&lt;/a>&lt;/p>
&lt;p>&lt;a href="CPP%200cfaab30bd8344c6aa29a581cb2d8ccf/C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84mutable%200edc2ed4eb114446ae9c96b81a74de74.md">C++中的mutable&lt;/a>&lt;/p>
&lt;p>&lt;a href="CPP%200cfaab30bd8344c6aa29a581cb2d8ccf/C&amp;#43;&amp;#43;%E4%B8%AD%E7%9A%84%E6%99%BA%E8%83%BD%E6%8C%87%E9%92%88%20376fa1bb49634219b9bdc5e8a5bd830a.md">C++中的智能指针&lt;/a>&lt;/p></description></item></channel></rss>