程序员

[C++进阶]若不想使用编译器自动生成的函数,就该明确拒绝

2020-06-21  本文已影响0人  小鱼号的代码日记

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

独一无二的实例不允许被复制

例如:待售卖的房子

编译器产出的函数都是public

因此你可以将copy构造函数和copy assignment操作符声明为private

这样做并不绝对安全 因为member函数和friend函数还是可以调用你的private函数

因此需要将函数声明为private而且故意不实现它们(连接期报错)

将连接期报错移至编译期是可能的

需要提供一个基类将copy构造函数和copy assignment操作符声明为private

总结:

为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现

使用像uncopyable这样的base class 也是一种做法。

/***************************
effectivre c++
改善程序与设计的55个具体做法
条款6:若不想使用编译器自动生成的函数,就该明确拒绝
 ---------小鱼号的代码日记--------------
****************************/
/**************************

***************************/

class Uncopyable
{
public:
    Uncopyable()
    {}
    ~Uncopyable()
    {}
   private:
   Uncopyable(const Uncopyable&);
   Uncopyable& operator=(const Uncopyable&);
};
/**************************
独一无二的实例不允许被复制
例如:待售卖的房子
***************************/
class HomeForSale :private Uncopyable
{
public:
    HomeForSale()
    {}
   private:
   ///继承Uncopyable就不再声明copy构造函数和copy assignment操作符
   //HomeForSale(const HomeForSale&);
   //HomeForSale& operator=(const HomeForSale&);
};
int main()
{
    HomeForSale h1;
    HomeForSale h2;
    ///HomeForSale h3(h1);//企图拷贝h1-不该通过编译
    ///h1 = h2;//企图拷贝h2-不该通过编译

    ///编译器产出的函数都是public
    ///因此你可以将copy构造函数和copy assignment操作符声明为private
    ///这样做并不绝对安全 因为member函数和friend函数还是可以调用你的private函数
    ///因此需要将函数声明为private而且故意不实现它们(连接期报错)
    ///将连接期报错移至编译期是可能的
    ///需要提供一个基类将copy构造函数和copy assignment操作符声明为private
   return 0;
}
/**************************
总结:
为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现
使用像uncopyable这样的base class 也是一种做法。
***************************/


内容选自:
effectivre c++
改善程序与设计的55个具体做法
上一篇下一篇

猜你喜欢

热点阅读