即使从未调用复制CTOR也需要吗?

时间:2011-06-10 16:50:01

标签: c++ copy-constructor access-modifiers

考虑以下事项:

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在某种程度上涉及到虽然我不太明白如何。

由于

4 个答案:

答案 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)

  1. 这:

    X x3 =(X)1; 是int的c样式转换为X

  2. 类型的对象
  3. 此复制:

    X x2 = X(1);

  4. 已经过优化,但编译器仍然需要访问copy-constructor。

答案 3 :(得分:0)

Ist对象使用parrametrized构造函数,因为您知道它并且所有其他对象都使用复制构造函数。即为什么当你是makin它发生私人访问违规。其他两个对象正在使用复制构造函数。

这些是使用复制构造函数的方法。