C++大括號初始化和大括號賦值的區別


C++中我們可以平時使用vector等容器時一般這樣初始化:vector<int> p={1,2,3};

其中{1,2,3}是一種叫initializer_list的類型,是C++11新出的

除了可以用來初始化容器,

還可以像python一樣用:

for x in [1,2,3]:
    print(x)
 1 #include <iostream>
 2 
 3 int main(int argc, char **argv)
 4 {
 5     for(auto n : {1,2,3,4,5,6})
 6     {
 7         std::cout<<n<<std::endl;
 8     }
 9 
10 }

 

 

當然這篇博客主要是想記錄一下聲明直接初始化和聲明后賦值的區別:

 

聲明時直接初始化:

vector<int> p={1,2,3};

這直接調用相應的構造函數。

 

聲明之后再賦值:

vector<int> p;
p={1,2,3};

先調用默認構造函數,再調用拷貝構造函數(賦值運算重載符)。

 

自己寫個模板類,運行一下試試:

 1 template<typename T> class MyClass{
 2     public:
 3     vector<T> data;
 4     MyClass(initializer_list<T> li){data=li;cout<<"{}"<<endl;}
 5     MyClass(){}
 6     MyClass& operator=(initializer_list<T> li){data=li;cout<<"=="<<endl;}
 7 };
 8 
 9 
10 int main() {
11     MyClass<int> x={1,2,3};
12     MyClass<int> y;
13     y={2,3,4};
14     getchar();
15     return 0;
16 }

 

結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM