C++默認(rèn)函數(shù)生成規(guī)則如下:
1.只要指定了一個(gè)要求傳參的構(gòu)造函數(shù), 就會(huì)阻止編譯器生成默認(rèn)構(gòu)造函數(shù)殖氏。
2.只要定義了拷貝構(gòu)造函數(shù)或移動(dòng)構(gòu)造函數(shù),就會(huì)阻止默認(rèn)構(gòu)造函數(shù)哗讥。
3.兩種拷貝操作是彼此獨(dú)立的, 即顯式聲明了其中一個(gè), 不會(huì)阻止編譯器默認(rèn)生成另一個(gè)辙芍。
4.兩種移動(dòng)操作并不彼此獨(dú)立, 即顯式聲明了其中一個(gè), 就會(huì)阻止編譯器默認(rèn)生成另一個(gè)。
5.一旦顯式聲明了拷貝操作, 就會(huì)阻止編譯器默認(rèn)生成移動(dòng)操作咆耿。
6.一旦顯式聲明了移動(dòng)操作, 就會(huì)阻止編譯器默認(rèn)生成拷貝操作德谅。
class A {
public:
A(){cout<<"defaut constructor" <<endl;}
A(const A &a) {cout<<"copy constructor" <<endl;}//copy constructor
A &operator=(const A &a) {cout<<"copy assignment constructor" <<endl;return *this; }//copy assignment constructor
A(A &&a) {cout<<"move constructor" <<endl;}
//A &operator=(A &&a) {cout<<"move assignement constructor" <<endl;return *this; }
};
void testClass()
{
A a;
A b;
A c(std::move(a));
// a=b;
//A d(std::move(b));
A e;
e = std::move(b);
}
輸出:
defaut constructor
defaut constructor
move constructor
defaut constructor
copy assignment constructor
參考鏈接:https://blog.csdn.net/mozifight/article/details/126556316