Avr*_*dis 18 c++ constructor copy-constructor private-constructor
例如,我想声明一个类,但我希望客户端无法使用复制构造函数(或复制赋值运算符)
以下两个都不允许使用复制构造函数:
1.
class Track
{
public:
Track(){};
~Track(){};
private:
Track(const Track&){};
};
Run Code Online (Sandbox Code Playgroud)
2.
class Track
{
public:
Track(){};
~Track(){};
Track(const Track&)=delete;
};
Run Code Online (Sandbox Code Playgroud)
其中一种方式"比其他方式更正确"还是相同?有副作用吗?
//Does not compile with both the above ways
int main()
{
Track l;
Track p(l);
}
Run Code Online (Sandbox Code Playgroud)
jal*_*alf 16
私有化是这种做法的"旧"方式.构造函数仍然存在,但它是私有的,只能从另一个类成员函数中调用.
= delete 删除构造函数.它不是由编译器生成的,它根本就不存在.
所以最有可能的,= delete就是你想要的.(尽管有一点需要注意,并非所有编译器都支持这种语法,所以如果可移植性是一个问题......)
声明复制构造函数private仍然允许Track类的成员函数复制 - 构造该类的实例,同时删除它只是禁止复制构造该对象.
在C++ 11中,删除复制构造函数是表达类是不可复制的事实的正确方法(除非你让成员函数Track或朋友Track复制构造Track对象是有意义的) .
将构造函数设为私有在旧C++中基本上是"黑客",因为它是防止用户使用它们的唯一方法.对能力delete的特殊成员函数的C++ 11只是介绍,这是更好,更地道的方式说,一个类不能被复制.因为它是明确的意图.
私有构造函数除了完全禁止其使用之外还有其他用途(例如,它们可以由静态类成员函数调用).因此,仅仅将构造函数设为私有并不能很好地传达意图,结果错误也不是很清楚.
| 归档时间: |
|
| 查看次数: |
2682 次 |
| 最近记录: |