关于合成的拷贝控制成员的一点问题
?1.如果一個類的某個成員有const或引用類型的成員,那么這個類的拷貝賦值運算符是刪除的或者不可訪問的。
#include <string> #include <iostream> #include <memory> int number_x = 1234; using namespace std; class Sales_data{public:Sales_data() = default;Sales_data(double d,unsigned u):revenue(d),units_sold(u){}Sales_data(const string &s):bookno(s){}private:Sales_data(const Sales_data &s):bookno(s.bookno),revenue(s.revenue),units_sold(s.units_sold){}string bookno;double revenue = 0.0;unsigned units_sold =0;int &number = number_x; };struct Other{public:Other()= default;Other(const Other &o)= default;Other& operator=(const Other& ) = default;private:Sales_data s1;int k;};int main() { Sales_data s; Sales_data s1("youaregood"); Sales_data s2(12.3,123); Other o1; Other o2; o2 = o1;return 0; }編譯后,o2 = o1發生錯誤,如下:
1.cc: In function ‘int main()’: 1.cc:42:6: error: use of deleted function ‘Other& Other::operator=(const Other&)’42 | o2 = o1;| ^~ 1.cc:27:10: note: ‘Other& Other::operator=(const Other&)’ is implicitly deleted because the default definition would be ill-formed:27 | Other& operator=(const Other& ) = default;| ^~~~~~~~ 1.cc:27:10: error: use of deleted function ‘Sales_data& Sales_data::operator=(const Sales_data&)’ 1.cc:6:7: note: ‘Sales_data& Sales_data::operator=(const Sales_data&)’ is implicitly deleted because the default definition would be ill-formed:6 | class Sales_data{| ^~~~~~~~~~ 1.cc:6:7: error: non-static reference member ‘int& Sales_data::number’, can’t use default assignment operator如果類的某個成員的有一個const的或者引用成員,則類的合成拷貝賦值運算符被定義為刪除的。
2.如果一個類有一個引用類型的成員,它沒有類內初始化器,那么默認構造函數定義為刪除的。
其它總結:
合成的拷貝控制成員可能是刪除的
如前所述,如果我們未定義拷貝控制成員,編譯器會為我們定義合成的版本。類似的,如果一個類未定義構造函數,編譯器會為其合成一個默認構造函數。對某些類來說,編譯器將這些合成的成員定義為刪除的函數:
(1)如果類的某個成員的析構函數是刪除的或者不可訪問的,則類的合成析構函數被定義為刪除的。
解釋:類的某個成員的析構函數是刪除的或不可訪問的,那么這個成員是不可刪除的,當然這個類的對象也是不可刪除的了。
(2)如果類的某個成員的拷貝構造函數是刪除的或者不可訪問的,那么類的合成拷貝構造函數被定義為刪除的。如果類的某個成員的析構函數是刪除的或者不可訪問的,則類合成的拷貝構造函數也是被定義為刪除的。
解釋:類的某個成員的拷貝構造函數是刪除的或者不可訪問的,那么說明類的這個成員的拷貝構造函數是無法調用的,那么這個類的拷貝構造函數當然是不可訪問的。因為類的拷貝構造函數會調用類的成員的拷貝構造函數。
(3)如果類有一個const的或引用成員,則類的合成拷貝賦值運算符被定義為刪除的。
解釋:這條記住就可以了。但是,如果這個const或者引用成員有一個類內初始值,另當別論,拷貝構造函數完全可以是正常的。
(4)如果類的某個成員的析構函數是刪除的或不可訪問的,或是類有一個引用成員,它沒有類內初始化器,或是類有一個const成員,它沒有類內初始化器且其類型未顯式定義默認構造函數,則該類的合成的默認構造函數被定義為刪除的。
總結
以上是生活随笔為你收集整理的关于合成的拷贝控制成员的一点问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中如何初始化类中const或引用类
- 下一篇: 引用做类中成员变量