明确拒绝编译器自动生成的函数
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{...};
以上是关于明确拒绝编译器自动生成的函数的主要内容,如果未能解决你的问题,请参考以下文章