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 }
結果: