先上代碼
#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;
}
當用初始化列表時,輸出如下:

當不用初始化列表時:

總結:當不用初始化列表進行初始化時,先調用默認構造函數構造了類成員,然后再調用賦值運算符對之前默認構造的類成員進行賦值,這實際上進行了兩步操作。
當用初始化列表了,程序直接調用了拷貝構造函數,只需要一步操作。
