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

Posted cs0915

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了明确拒绝编译器自动生成的函数相关的知识,希望对你有一定的参考价值。

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

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{...};

 

以上是关于明确拒绝编译器自动生成的函数的主要内容,如果未能解决你的问题,请参考以下文章

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

条款6:不想使用编译器自动生成的函数,就要明确拒绝!

条款10 若不想使用编译器自动生成的函数,就该明确拒绝

条款6:若不想使用编译器自动生成的函数,就该明确拒绝

如果不想使用编译器默认生成的函数,请明确拒绝它!

C++如何拒绝编译器自动生成的函数