考虑以下事项:
class X {
public:
X(int i) { cout << "X(int i)" << endl; }
X(const X& x) { cout << "X(const X& x)" << endl; }
};
void main() {
X x1(1);
X x2 = X(1);
X x3 = (X)1;
}
运行此代码会产生以下输出:
X(int i)
X(int i)
X(int i)
我认为以上所有三个陈述都是等同的,因为从未调用过CTOR副本。但是,将X
的副本CTOR更改为私有:
class X {
public:
X(int i) { cout << "X(int i)" << endl; }
private:
X(const X& x) { cout << "X(const X& x)" << endl; }
};
将无法编译(在Visual Studio 2010中)出现此错误:
cannot access private member declared in class 'X'
所以看起来复制CTOR在某种程度上涉及到虽然我不太明白如何。
由于
答案 0 :(得分:5)
X x1(1);
X x2 = X(1);
X x3 = (X)1;
原因是所有这些都不完全相同。
第一个是直接初始化,而第二个和第三个是复制初始化。对于复制初始化,copy-constructor必须是public,否则编译器会给出错误。
现在问题是,如果第二个和第三个要求copy-ctor公开,那么为什么输出如下:
X(int i)
X(int i)
X(int i)
这肯定说从未调用copy-ctor,这是真的。编译器刚刚调用了copy-ctor。根据§8.5/ 14,在这种情况下,允许编译器不需要调用copy-constructor。这就是为什么你没有看到copy-ctor被调用的原因。
一点内部:在第二和第三种情况下,首先通过调用X(int i)
创建临时,然后将此临时文件传递给copy-ctor以复制初始化正在声明的对象。但是编译器优化了这一步骤,忽略了对copy-ctor的调用。
答案 1 :(得分:3)
X x2 = ...
调用复制构造函数(即使编译器稍后对其进行优化)。因此,它仍然可以访问。
答案 2 :(得分:0)
这:
X x3 =(X)1;
是int
的c样式转换为X
此复制:
X x2 = X(1);
已经过优化,但编译器仍然需要访问copy-constructor。
答案 3 :(得分:0)
Ist对象使用parrametrized构造函数,因为您知道它并且所有其他对象都使用复制构造函数。即为什么当你是makin它发生私人访问违规。其他两个对象正在使用复制构造函数。
这些是使用复制构造函数的方法。