禁止拷贝和赋值构造函数

作者: admin 分类: C++ 发布时间: 2020-06-04 22:05

禁止拷贝和赋值构造函数

如果想让类不能使用拷贝构造函数和赋值操作符,只要将该类的拷贝构造函数和赋值操作符函数定义为private即可,并且只是声明,不用实现.

#include <stdio.h>

#include <iostream>

 

#define RTC_DISALLOW_ASSIGN(TypeName) \

  void operator=(const TypeName&) = delete

 

#define RTC_DISALLOW_COPY_AND_ASSIGN(TypeName) \

  TypeName(const TypeName&) = delete;          \

  RTC_DISALLOW_ASSIGN(TypeName)

 

#define RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \

  TypeName() = delete;                               \

  RTC_DISALLOW_COPY_AND_ASSIGN(TypeName)

 

class Simple

{

public:

Simple()

{

}

 

private:

RTC_DISALLOW_COPY_AND_ASSIGN(Simple);

};

————————————————

版权声明:本文为CSDN博主「boywgw」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/boywgw/java/article/details/53897291

Google C++编程规范 – 第三十二条 -《拷贝构造函数》

【规范】

仅在确认需要的时候,才定义拷贝构造函数和赋值运算符;否则,请使用DISALLOW_COPY_AND_ASSIGN关闭此功能。

【定义】

我们通过拷贝构造函数和赋值运算符来实现对一个类对象的拷贝。在一些情况下,编译器会隐式的调用拷贝构造函数,比如在以值传递方式传递对象时。

【支持者的声音】

拷贝构造函数,使得拷贝一个类对象变得很容易。STL容器更是规定其内容都要是可拷贝和可赋值的。拷贝构造方式要比CopyFrom方式更加高效,这是因为拷贝构造方式将构造和拷贝两者结合起来了。而且在一些上下文中编译器会省略掉它们,并且它们会更容易的避免堆分配。

【反对者的声音】

 

隐式的类对象拷贝会引入很多bug和性能方面的问题,还会因为很难追踪一个类对象的行为而导致代码的可读性的降低。

【结论】

只有很少的类需要进行拷贝。而大多数的类既不需要拷贝构造函数,也不需要赋值运算符。在很多情况下,一个指针或一个引用其实已经足够,而且还会有更好的性能表现。比如,你可以通过传入指针、引用来代替传入一个值,你还可以在STL容器中保存对象的指针,而非对象本身。

如果你的类就是需要可拷贝,那么最好提供一个拷贝方法,比如CopyFrom()或Clone(),而非一个拷贝构造函数,这样可以有效的避免隐式调用。如果拷贝方法还不足以满足你的需求(比如性能方面的原因,或者你的类就是需要在容器中保存对象本身),那么请同时提供拷贝构造函数和赋值运算符。

如果你的类不需要拷贝构造函数或赋值运算符,那么请显式的禁用它们。禁用的方法是在类的private区域中增加一个拷贝构造函数和赋值运算符的哑声明,但是不要提供相应的定义。

DISALLOW_COPY_AND_ASSIGN本身是一个宏,其定义如下:

// A macro to disallow the copy constructor and operator= functions
// This should be used in the private: declarations for a class
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
  TypeName(const TypeName&);               \
  void operator=(const TypeName&)

然后,我们可以在Foo类中这样使用:

class Foo {
 public:
  Foo(int f);
  ~Foo();

 private:  DISALLOW_COPY_AND_ASSIGN(Foo);};


禁止拷贝和赋值构造函数DISABLE_COPY_ADN_ASSIGN

#define  DISABLE_COPY_ADN_ASSIGN(ClassName)\

                     ClassName(const ClassName &);\

                     void operator = (const ClassName &)

在没有显示定义时,编译器默认定义4个函数:

默认构造函数 A();     A a;

析构函数 ~A();  

拷贝构造函数 A(A&);   A a(b);

赋值构造函数A& operator = (A&);   A a=b;

后面为对应的使用方式。

使用DISABLE_COPY_ADN_ASSIGN须在private:下。

private:

    DISABLE_COPY_AND_ASSIGN(Test);

声明私有的拷贝构造函数和赋值构造函数,但不去定义实现它们,有三方面的作用:

1.声明了拷贝构造函数和赋值函数,阻止了编译器暗自创建的专属版本.

2.声明了private,阻止了外部对它们的调用.

3.不定义它们,可以保证成员函数和友元函数调用它们时,产生一个连接错误.

————————————————

版权声明:本文为CSDN博主「huang_yx005」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/huang_yx005/java/article/details/51437355

// A macro to disallow the copy constructor and operator= functions

#ifndef DISALLOW_COPY_AND_ASSIGN

#define DISALLOW_COPY_AND_ASSIGN(TypeName) \

 TypeName(const TypeName&) = delete; \

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

#endif

 

节选自 https://github.com/PlatformLab/NanoLog.git

代码中: <<common.h>>

C++禁止使用拷贝构造函数和赋值运算符方法

1.将拷贝构造函数和赋值运算符声明为私有,并不予实现

class Uncopyable  
{  
private:  
    Uncopyable(const Uncopyable &); // 阻止copying  
    Uncopyable &operator=(const Uncopyable &);  
};

2.使用delete

class Uncopyable  
{  

    Uncopyable(const Uncopyable &) =delete; // 阻止copying  
    Uncopyable &operator=(const Uncopyable &)=delete;  
};

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

标签云