先上代码
#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; }
当用初始化列表时,输出如下:
当不用初始化列表时:
总结:当不用初始化列表进行初始化时,先调用默认构造函数构造了类成员,然后再调用赋值运算符对之前默认构造的类成员进行赋值,这实际上进行了两步操作。
当用初始化列表了,程序直接调用了拷贝构造函数,只需要一步操作。