如果没有显式复制构造函数,是否可以禁止赋值? 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
这是关于显式构造函数的。
第二部分是避免复制和赋值。所以,为此你有两个选择
按照其他人的建议,使用boost::noncopyable
记得"The rule of three/five/zero"
http://en.cppreference.com/w/cpp/language/rule_of_three, 让你的
复制构造函数,将构造函数和赋值运算符移动为已删除。
让我们假设我 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
这是关于显式构造函数的。
第二部分是避免复制和赋值。所以,为此你有两个选择
按照其他人的建议,使用boost::noncopyable
记得"The rule of three/five/zero" http://en.cppreference.com/w/cpp/language/rule_of_three, 让你的 复制构造函数,将构造函数和赋值运算符移动为已删除。