<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## 一.默認初始化 1. **概念** 定義變量時沒有指定初始值時進行的初始化操作。 + 沒有(括號)初始化器或等號。 2. 初始化結果 + 內置變量的默認初始化的值取決于其作用域。 + 數組的每個元素同樣執行默認初始化。 + 類類型的變量的默認初始化會調用無參構造函數。如果用戶未指定,則非靜態數據成員同樣執行默認初始化。 ```c++ //執行了默認初始化 int i; //其中分配到的空間執行了默認初始化 int *p = new int; ``` > [03-] `new 類型()` 也是默認初始化 ## \[03+\][$]二.值初始化 1. **概念** 使用了括號進行初始化,但沒有提供初始值的情況。 + 有括號(初始化器) + 沒有初始值 2. 初始化結果 + 內置類型值初始化為0。 + 數組的每個元素同樣執行值初始化。 + 類類型值初始化會調用相應無參構造函數。如果用戶未指定,則非靜態數據成員執行默認初始化。 + 定義標準庫容器對象時,若只聲明了容器大小,則其元素執行值初始化。 ```c++ //其中int() 產生的臨時變量執行了值初始化 int i = int(); //其中new int() 分配到的空間執行了值初始化 int *p = new int(); //對,這也是值初始化 vector<int> v(10); ``` >[warning] 若初始化器沒有參數,則編譯器會將該表達式視為函數聲明。 ```c++ //這是一個函數聲明,而不是一個變量的定義 int i(); ``` ## 三.直接初始化 1. **概念** 使用括號進行初始化且指定了初始值。 + 有括號(初始化器) + 有初始值 ```c++ //i1是直接初始化 int i1(10); //[11+]i2也是直接初始化 int i2{10}; //v不是直接初始化,而是值初始化 vector<int> v(10); ``` ## 四.拷貝初始化 1. **時機** > 成員初始化列表不支持拷貝初始化。 - 使用等號進行初始化 - 使用一個對象初始化另一個對象 - 從函數返回一個對象 2. 結果 - 若使用一個同類型左值初始化對象,則調用 **拷貝構造函數**(內置類型是直接復制)。 - **\[17+\][17-的編譯器可能支持]** 若使用同類型的右值(新標準為純右值)初始化一個對象時,會發生 **復制消除** ,此時不會創建臨時變量,而是直接用右邊的表達式初始化左邊的對象。 - 若等號左右兩邊類型不匹配,則調用 **轉換構造函數**(內置類型直接隱式轉換)。 >[warning] 以下示例請使用支持 C++17標準的編譯器運行。 ```c++ #include <iostream> using namespace std; class Complex { private: double real_; double imaginary_; public: Complex() : real_(0), imaginary_(0) { cout << "已調用無參構造函數" << endl; } Complex(double real) : real_(real), imaginary_(0) { cout << "已調用普通構造函數" << endl; } Complex(double real, double imaginary) : real_(real), imaginary_(imaginary) { cout << "已調用普通構造函數" << endl; } Complex(const Complex &old) { this->real_ = old.real_; this->imaginary_ = old.imaginary_; cout << "已調用拷貝構造函數" << endl; } Complex &operator=(const Complex &old) { this->real_ = old.real_; this->imaginary_ = old.imaginary_; cout << "已調用拷貝賦值函數" << endl; return *this; } Complex &operator=(const Complex &&old) { this->real_ = old.real_; this->imaginary_ = old.imaginary_; cout << "已調用移動賦值函數" << endl; return *this; } double get_real() { return this->real_; } double get_imaginary() { return this->imaginary_; } Complex &set_real(double new_val) { this->real_ = new_val; return *this; } Complex &set_imaginary(double new_val) { this->imaginary_ = new_val; return *this; } }; int main() { Complex a; //默認初始化,調用無參構造函數 Complex b(10, 10); //直接初始化,調用普通構造函數 Complex c = 10; //拷貝初始化,調用普通構造函數 Complex d = c; //拷貝初始化,調用拷貝構造函數 Complex e(a); //拷貝初始化,調用拷貝構造函數 Complex f = Complex(Complex(1, 2)); //拷貝初始化,且只初始化一次(發生了復制消除),相當于 `Complex f(1,2);`,調用普通構造函數 f = e; //拷貝賦值,調用拷貝賦值函數 f = Complex(3, 4); //移動賦值,先調用普通構造函數,再調用移動賦值函數 return 0; } ``` >[test] >已調用無參構造函數 >已調用普通構造函數 >已調用普通構造函數 >已調用拷貝構造函數 >已調用拷貝構造函數 >已調用普通構造函數 >已調用拷貝賦值函數 >已調用普通構造函數 >已調用移動賦值函數 >[warning] 以下示例可使用任意標準的編譯器運行。 ```c++ #include <iostream> using namespace std; class Complex { private: double real_; double imaginary_; public: Complex() : real_(0), imaginary_(0) { cout << "已調用無參構造函數" << endl; } Complex(double real) : real_(real), imaginary_(0) { cout << "已調用普通構造函數" << endl; } Complex(double real, double imaginary) : real_(real), imaginary_(imaginary) { cout << "已調用普通構造函數" << endl; } Complex(const Complex &old) { this->real_ = old.real_; this->imaginary_ = old.imaginary_; cout << "已調用拷貝構造函數" << endl; } Complex &operator=(const Complex &old) { this->real_ = old.real_; this->imaginary_ = old.imaginary_; cout << "已調用拷貝賦值函數" << endl; return *this; } double get_real() { return this->real_; } double get_imaginary() { return this->imaginary_; } Complex &set_real(double new_val) { this->real_ = new_val; return *this; } Complex &set_imaginary(double new_val) { this->imaginary_ = new_val; return *this; } }; int main() { Complex a; //默認初始化,調用無參構造函數 Complex b(10, 10); //直接初始化,調用普通構造函數 Complex c = 10; //拷貝初始化,調用普通構造函數 Complex d = c; //拷貝初始化,調用拷貝構造函數 Complex e(a); //拷貝初始化,調用拷貝構造函數 Complex f = Complex(1, 2); //拷貝初始化,可能先調用普通構造函數,再調用拷貝構造函數,也可能直接調用普通構造函數 f = e; //拷貝賦值,調用拷貝賦值函數 f = Complex(3, 4); //拷貝賦值,先調用普通構造函數,再調用拷貝賦值函數 return 0; } ``` >[test-gpp] > 已調用無參構造函數 > 已調用普通構造函數 > 已調用普通構造函數 > 已調用拷貝構造函數 > 已調用拷貝構造函數 > 已調用普通構造函數 > 已調用拷貝構造函數 > 已調用拷貝賦值函數 > 已調用普通構造函數 > 已調用拷貝賦值函數 >[test-vc] > 已調用無參構造函數 > 已調用普通構造函數 > 已調用普通構造函數 > 已調用拷貝構造函數 > 已調用拷貝構造函數 > 已調用普通構造函數 > 已調用拷貝賦值函數 > 已調用普通構造函數 > 已調用拷貝賦值函數 ## \[11+\][$]五.列表初始化 1. **概念** 用大括號進行初始化的情況。如數組和結構體的初始化。 2. 當類沒有用戶定義的構造函數,或某個構造函數參數類型為 `std::initializer_list` 時,該類可執行列表初始化。 ```c++ //v1直接列表初始化 std::vector v1{1,2,3,4,5}; //v2復制列表初始化 std::vector v2 = {1,2,3,4,5}; ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看