条款 27: 如果不想使用隐式生成的函数就要显式地禁止它

        假设想写一个类模板 Array,它所生成的类除了可以进行上下限检查外,其它行为和 C++标准数组一样。设计中面临的一个问题是怎么禁止掉 Array 对象之间的赋值操作,因为对标准 C++数组来说赋值是不合法的:

double values1[10];

double values2[10];

values1 = values2; //  错误!

        对很多函数来说,这不是个问题。如果你不想使用某个函数,只用简单地不把它放进类中。然而,赋值运算符属于那种与众不同的成员函数,当你没有去写这个函数时,C++会帮你写一个(见条款 45) 。那么,该怎么办呢

       方法是声明这个函数(operator=) ,并使之为 private显式地声明一个成员函数,就防止了编译器去自动生成它的版本使函数为 private,就防止了别人去调用它。

       但是,这个方法还不是很安全,成员函数和友元函数还是可以调用私有函数,除非——如果你够聪明的话——不去定义(实现)这个函数。这样,当无意间调用了这个函数时,程序在链接时就会报错

     template<class T>
     class Array {
    private:
     //  不要定义这个函数!
    Array& operator=(const Array& rhs);
}

       当用户试图对 Array 对象执行赋值操作时,编译器会不答应;当你自己无意间在成员或友元函数中调用它时,链接器会嗷嗷大叫。

      不要因为这个例子就认为本条款只适用于赋值运算符。不是这样的。它适用于条款 45 所介绍的每一个编译器自动生成的函数。实际应用中,你会发现赋值和拷贝构造函数具有行为上的相似性(见条款 11 和 16) ,这意味着几乎任何时候当你想禁止它们其中的一个时,就也要禁止另外一个。

     总结:对于编译器自动生成的函数,想禁止使用这个函数,必须先禁止生成这个函数,方法是显示定义这个函数,想禁止使用,则把显示定义的函数放在private,想禁止成员函数和友员函数使用则只声明不定义,综上所述:对不想使用的函数声明为private,且只声明不定义。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值