20.如何避免拷贝-灵析社区

菜鸟码转

最直观的想法是:将类的拷贝构造函数和赋值运算符重载声明为私有 private,但对于类的成员函数和友元函数依然可以调用,达不到完全禁止类的对象被拷贝的目的,而且程序会出现错误,因为未对函数进行定义。

1.声明一个基类,具体做法如下。

  • 定义一个基类,将其中的拷贝构造函数和赋值运算符重载声明为私有 private。
  • 派生类以私有 private 的方式继承基类。
class Uncopyable
{
public:
    Uncopyable() {}
    ~Uncopyable() {}

private:
    Uncopyable(const Uncopyable &);            // 拷贝构造函数
    Uncopyable &operator=(const Uncopyable &); // 赋值运算符
};
class A : private Uncopyable // 注意继承方式
{ 
};

简单解释:

  • 能够保证,在派生类 A 的成员函数和友元函数中无法进行拷贝操作,因为无法调用基类 Uncopyable 的拷贝构造函数或赋值运算符重载。同样,在类的外部也无法进行拷贝操作。

2.拷贝构造函数 =delete 修饰:

C++ 11 支持 delete 直接禁用类的成员函数调用。

class Uncopyable
{
public:
    Uncopyable() {}
    ~Uncopyable() {}
     Uncopyable(const Uncopyable &) = delete;            // 禁用拷贝构造函数
     Uncopyable &operator=(const Uncopyable &) = delete; // 禁用赋值运算符
};


阅读量:1926

点赞量:0

收藏量:0