日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于合成的拷贝控制成员的一点问题

發布時間:2024/4/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于合成的拷贝控制成员的一点问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?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成員,它沒有類內初始化器且其類型未顯式定義默認構造函數,則該類的合成的默認構造函數被定義為刪除的。

總結

以上是生活随笔為你收集整理的关于合成的拷贝控制成员的一点问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。