码迷,mamicode.com
首页 > 其他好文 > 详细

明确拒绝编译器自动生成的函数

时间:2020-04-21 18:38:43      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:自动   ssi   UNC   拒绝   安全   style   sign   函数   operator   

有时候不想让类的对象支持复制和赋值,即不支持下面第五行和第六行的操作

1 class HomeForSale {...};
2 
3 HomeForSale h1;
4 HomeForSale h2;
5 HomeForSale h3(h1);//不想通过
6 h1=h2;//也不想通过

如果自己不声明对应的copy构造函数和copy assignment操作符,编译器会为自己声明它们,这导致还是会支持上面的操作。

此时可以自己声明它们,这样编译器就不会再生成它们。而且要令这些函数为private,这样可以阻止人们调用它们。

1 class HomeForSale
2 {
3   public:
4      ...
5   private:
6      //只用声明它们而不用定义实体  
7      HomeForSale(const HomeForSale&);
8      HomeForSale& operator=(const HomeForSale&);  
9 }

这样做并非一定是安全的,类的成员函数和friend函数还是可以调用private函数,此时会出现链接错误。

为了将链接错误移至编译期实现(这是好事,错误越早发现越好),可以在基类而不是本类中声明上述两个private函数,再让本类继承基类。

1 class Uncopyable
2 {
3   Uncopyable(){}
4   ~Uncopyable(){}
5 private:
6   Uncopyable(const Uncopyable&);
7   Uncopyable& operator=(const Uncopyable&);  
8 }
9 class HomeForSale: private Uncopyable{...};

 

明确拒绝编译器自动生成的函数

标签:自动   ssi   UNC   拒绝   安全   style   sign   函数   operator   

原文地址:https://www.cnblogs.com/cs0915/p/12746028.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!