21xrx.com
2024-12-22 21:21:09 Sunday
登录
文章检索 我的文章 写文章
C++中的禁止拷贝和赋值操作
2023-07-12 16:42:28 深夜i     --     --
C++ 禁止 拷贝 赋值 操作

在C++中,禁止拷贝和赋值操作是一种常见的技巧,它可以帮助我们避免在对象的生存期中发生一些不可预测的行为。在很多时候,我们希望某些类的实例不能被拷贝或赋值,比如单例模式中的那个唯一实例,或者是有着严格语义的对象(例如文件句柄)。

禁止对象拷贝最常见的方式就是声明私有的拷贝构造函数和赋值运算符。这可以防止类的实例从另一个实例中拷贝构造或者赋值。比如下面这个类:


class Singleton {

public:

  static Singleton& instance()

    static Singleton s;

    return s;

  

private:

  Singleton() {}

  Singleton(const Singleton&) = delete;

  Singleton& operator=(const Singleton&) = delete;

};

这里的Singleton类定义了一个静态的instance()函数,用来获取唯一的实例。为了确保这个实例是唯一的,我们把拷贝构造函数和赋值运算符都设为了私有的,这样就不能从其他地方拷贝或者赋值给它了。

除了使用delete关键字,C++11还提供了用 = default来表示使用默认的操作(默认拷贝构造函数和默认赋值运算符),这种方式也可以用来禁止对象拷贝,只需要把拷贝构造函数和赋值运算符声明为= default即可。不过需要注意的是,这种方式只在需要默认操作的情况下才可用,如果我们需要自己实现拷贝构造函数或者赋值运算符,则需要显式地将它们设为delete。

除了禁用拷贝和赋值操作,我们还可以使用“引用计数”的方式来确保类的实例的生存期。这种方式可以在每个实例中保存一个计数器,每当有一个新的引用指向实例时,计数器加1;当引用离开作用域时,计数器减1。当计数器为0时,就可以销毁这个实例了。当然,需要注意的是,引用计数需要在多线程环境下进行同步,避免出现竞态条件。

总之,禁止对象拷贝和赋值操作是一种常见的技巧,它可以确保我们的类在对象生存期中保持正确的语义。我们可以使用delete关键字或者= default来实现它,也可以使用引用计数等方式来确保实例的正确管理。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复