如果没有显式复制构造函数,是否可以禁止赋值? C++

is it possible to forbid assignment if there is no explicit copy constructor? c++

让我们假设我 class 没有显式复制构造函数。是否可以禁止为此class分配或复制对象的操作?例如:

class A
{
   // data, methods, but no copy constructor and no overloaded assignment operator
};

A object1;
A object2;

object1 = object2; // make compiler error here

A object3 = object1; // or here

Let's assume I have class with no explicit copy constructor. Is it possible to forbid operation of assigning or copying objects for this class?

boost::noncopyable 派生,一个不可复制的基础 class,或者添加一个不可复制的非静态数据成员。

如果你没有显式拷贝构造函数。编译器将为您创建一个默认的。

  • 禁止复制使复制构造函数私有。
  • 要禁止赋值,将赋值运算符设为私有

我也可以在没有定义的情况下声明复制构造函数或赋值运算符。当我调用它们中的任何一个时,我都会收到链接器错误。

您可以将复制构造函数和复制赋值运算符标记为已删除:

class A
{
public:
    ...

    A(const A&) = delete;
    A& operator=(const A&) = delete;
};

如果您的编译器不支持这样的 C++11 功能,只需将函数 private.

试试这个

private:

        A(A const&); //Don't implement it
        A& operator=(A const&);//Don't implement it

或使用 C++ 11

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

隐式复制构造函数和赋值运算符只有在编译器可以生成时才能调用。他们(至少在概念上)复制基础 class,然后执行所有成员的成员复制。如果无法执行这些操作中的任何一个,则不会生成隐式复制构造函数或赋值运算符。

因此,您可以通过从不可复制的基派生 class 或通过包含不可复制类型的(非静态)成员来禁止这些操作。

作为编码原则,我认为将操作显式声明为已删除(或私有、C++11 之前的)成员比依赖不可复制成员或基类的存在更清楚 class。如果 member/base 被命名为传达该意图(例如 boost::noncopyable),我将破例。

您的问题分为两部分:

首先是显式构造函数,显式构造函数的目的是避免隐式构造。通过隐式构造我的意思是

struct C {
    int a;
    C(int p):a(p) {}
    ~C(){std::cout<<"Destructor for "<<a<<'\n';}
};
int main() {
  C c1 = 142; // implicit-initialization, calls C::C(42)
  C c2{12}; // 

  return 0;
}

但是如果我们将构造函数显式设置为

explicit C(int a);

那么下面的代码将无法编译。

C c1 = 142; // would not compile

这是关于显式构造函数的。

第二部分是避免复制和赋值。所以,为此你有两个选择

  1. 按照其他人的建议,使用boost::noncopyable

  2. 记得"The rule of three/five/zero" http://en.cppreference.com/w/cpp/language/rule_of_three, 让你的 复制构造函数,将构造函数和赋值运算符移动为已删除。