先上代碼
#include <iostream> class MyContruct { public: MyContruct() { std::cout << "MyContruct() is called" << std::endl; } MyContruct(const MyContruct&) { std::cout << "MyContruct(const MyContruct&) is called" << std::endl; } MyContruct& operator=(const MyContruct&) { std::cout << "MyContruct& operator=(const MyContruct&) is called" << std::endl; return *this; } ~MyContruct() { std::cout << "~MyContruct() is called" << std::endl; } }; class Mytest { public: Mytest(MyContruct mc) :m_pMc(mc) { std::cout << "Mytest(MyContruct mc) is called" << std::endl; /*m_pMc = mc;*/ } ~Mytest() { std::cout << "~Mytest() is called" << std::endl; } private: MyContruct m_pMc; }; int main() { MyContruct mc; std::cout << std::endl; Mytest mt(mc); std::cout << std::endl; return 0; }
當用初始化列表時,輸出如下:
當不用初始化列表時:
總結:當不用初始化列表進行初始化時,先調用默認構造函數構造了類成員,然后再調用賦值運算符對之前默認構造的類成員進行賦值,這實際上進行了兩步操作。
當用初始化列表了,程序直接調用了拷貝構造函數,只需要一步操作。