它是正确的使用声明仅适用于C ++空的私有构造?
-
19-09-2019 - |
题
例如这是正确的:
class C
{
private:
C();
C(const & C other);
}
或者应而提供的定义(一个或多个):
class C
{
private:
C() {};
C(const & C other) {};
}
? 由于当前的答案。让我们扩展了这个问题 - 没有编译器生成这样的例子一个更好的代码?我可以想像,对于构造函数编译力量提供体包括在编译单元的一些(空)代码?这也适用于自动生成的代码?
解决方案
如果你不希望你的对象是可复制,那么就没有必要提供实现。只是声明拷贝构造函数私有,没有任何执行。这同样适用于其他构建函数,如果你不希望任何机构使用它们,只是声明为private没有任何执行。
其他提示
这是罚款,只要你不使用它们。
使用的0X标准可以使用删除功能一>
class X {
// ...
X& operator=(const X&) = delete; // Disallow copying
X(const X&) = delete;
};
您可以使用声明仅构造为不允许给定结构中,如标准构造或复制的结构。
例如,如果你想避免你的对象被复制,你可以声明为private的拷贝构造函数和赋值运算符,但没有定义它们,那么任何人,包括你,谁试图复制的对象将有链接错误
关于上次编辑: 我期望一个体面的编译器能产生相同的代码的默认构造函数和一个空的构造和没有初始化列表,最终,它需要做的是默认初始化每个成员。
如果您没有提供实现声明它们,那么你不能使用它们,因为它们不存在。如果你要使用的构造函数,则必须让编译器不宣布他们创造他们,或者你必须声明它们并提供一个实现。
这是偶尔有用提供的声明,但对于你不想使用的构造函数没有实现。这通常与对象(如单身),你不希望这是拷贝,是有史以来拷贝构造函数中完成。在这种情况下,声明常常由私人以及
首先,如果你想使你的类完全不可复制的,没有实现私人拷贝构造函数和赋值操作符。否则,它仍然是可能的一段代码可以访问的方法(或朋友)可以默默地进行复印。如果没有实现,你会得到一个链接错误。
然而,编译器错误将是可取的,因为你会发现有关该错误的速度更快。对于这个有boost::noncopyable
,也可以从一个基类派生,它隐藏的及其拷贝构造函数和赋值运算符。
关于默认构造函数:编译器将不会生成一个,如果你声明任何构造的。通常没有必要隐藏特异性。
如果您使用“空”声明,编译器将不再生成默认的实现,你会得到链接错误。如果你声明它们,你必须给他们写这样的空括号的形式是必要的。
您需要提供的定义。如果不这样做,并尝试使用它们,它将无法链接。
这取决于您是否使用这些构造函数或没有。如果你不使用他们,你可以离开他们不确定。如果您使用的地方(例如,你创建的类的静态函数的类的对象,你需要定义他们),你需要提供的定义,否则你会从连接器获得解析的外部符号错误。