Effective c++学习笔记——条款6,不想自动生成函数,要明确拒绝

 Explicitly disallow the use of complier-generated functions you do not want
        上一条款我们已经知道,编译器会自动给我生成一些函数,那么当我们不希望class产生提供的方法,只要不声明对应函数就是了,但这个策略在对copy构造函数和copy assignment操作符时却不起作用,因为编译器会帮我们声明它们,解决的方法就是将它们声明为private,人为的组织它们被调用。
  
  1. class X {  
  2. public:  
  3. X() { }  
  4. private:  
  5. X(const X& rhs) { }  
  6. X& operator=(const X& rhs) {   
  7. X x;  
  8. return x;  
  9. }  
  10. };  

但这个做法并没有那么完美,因为member函数还有friend函数还是可以调用private函数。看下面的代码:
  1. class X {  
  2. public:  
  3. X() { }  
  4. private:  
  5. X(const X& rhs) { }  
  6. X& operator=(const X& rhs) {   
  7. X x;  
  8. return x;  
  9. }  
  10. friend void print(void);  
  11. };   
  12.   
  13. void print(void) {  
  14. X x;  
  15. X x2 = x;  
  16. };  
  
      唯一的办法就是根本就不实现它,让编译器链接时直接抱怨有错误。在boost类库中提供了一个阻止这些情况的类型用来给予开发人员使用。大致形如这样的设计:
  1. #include "stdafx.h"   
  2. #include <stdlib.h>   
  3.   
  4. class noncopyable {  
  5. protected:  
  6. noncopyable() { }  
  7. ~noncopyable() { }  
  8. private:  
  9. noncopyable(const noncopyable&);  
  10. noncopyable& operator=(const noncopyable&);  
  11. };  
  12.   
  13. class X : private noncopyable {   class 不在声明   
  14.   
  15.                                                      ///copy 构造函数或copy assign 操作符   
  16.   
  17. };  
  18.   
  19. int _tmain(int argc, _TCHAR* argv[]) {  
  20. X x;  
  21. X x2 = x;  
  22. system("pause");  
  23. return 0;  
  24. }  

        这行得通,因为只要任何人――甚至是 member函数或 friend函数――尝试拷贝 X 对象,编译器便试着生成一个 copy构造函数和一个 copy assignment操作符,这些函数的“编译器生成版“会尝试调用其 base class的对应兄弟,那些调用会被编译器拒绝,因为其 base class的拷贝函数是 private

请记住:

       为驳回编译器自动(暗自)提供的机能,可以将相应的成员函数声明为private并且不予实现。使用像Uncopyable这样的base class也是一种做法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值