使用命名对象

时间:2016-06-12 21:59:42

标签: c++ constructor copy-constructor

所以这是我的代码:

class A {
int x;
public:
    A(int p) {cout << "constructor\n"; }
    A(const A& p) { cout << "copy constructor\n";}
    A& operator=(const A& p) { cout << "assignment\n"; return *this;}
    ~A() {cout << "destructor\n";}
};  

A foo(){ A temp(3); return temp;}

int main()
{
    A a(1);
    A b = A(2);
    A c = foo();
    //A d = A e(4);   This one doesn't work!
}

我知道匿名对象(未命名对象)具有“表达式范围”,这意味着它们在创建它们的表达式的末尾被销毁。这意味着,在我们的代码中,未命名的对象一直存在,直到分号。

在12.2 / 3中说明:

  

临时对象在评估全表达式(1.9)的最后一步时被销毁,该表达式(词法上)包含创建它们的点。

所以,我知道命名对象和未命名对象在范围方面是不同的。

我的问题是为什么最后一行代码不起作用?范围是否与它有关?
为什么A c = foo();有效,看到正确的双手也是命名对象?

3 个答案:

答案 0 :(得分:4)

初始化需要右侧的表达式。 A e(4)不是表达式,而是声明。它没有价值。

答案 1 :(得分:1)

//A d = A e(4);   This one doesn't work!

这只是无效的语法。您不需要e,甚至在任何地方都不会被引用。

您的陈述应该是

A d = A(4);

A d(4);

答案 2 :(得分:0)

您可以使用A d = a;来调用复制构造函数。 这种情况A c = foo();由编译器减少到这种情况A b = A(2);,因为右侧的实体在分配后停止生存,它可以简单地使用右侧而不是左侧。