C ++对象实例化与分配

时间:2012-08-07 20:33:24

标签: c++ constructor default-constructor copy-assignment

这有什么区别:

TestClass t;

而且:

TestClass t = TestClass();

我希望第二个可以调用构造函数两次然后调用operator =,而是调用构造函数一次,就像第一次一样。

4 个答案:

答案 0 :(得分:15)

TestClass t;

调用默认构造函数。

TestClass t = TestClass();

复制初始化。它将调用TestClass()的默认构造函数,然后调用复制构造函数(理论上,复制受 copy elision 的约束)。 此处不进行任务

还有直接初始化的概念:

TestClass t(TestClass());

如果您想使用赋值运算符:

TestClass t;
TestClass s;
t = s;

答案 1 :(得分:3)

第一种情况非常简单 - 使用默认构造函数构造实例。

第二个类是构造一个匿名对象,然后调用复制构造函数。请注意,此处=不是赋值,它类似于(但不是identical)写作:

TestClass t(TestClass());

我们可以通过使复制构造函数不可用来验证它是否需要复制构造函数,例如:

#include <iostream>

struct TestClass {
  TestClass() { std::cout << "Ctor" << std::endl; }
  TestClass(const TestClass&)  = delete;
};

int main() {
  TestClass t = TestClass();
}

由于删除了复制构造函数而无法编译。 (在C ++ 03中,您可以使用private:代替。)

实际上最有可能发生的事情是你的编译器正在执行Return value optimisation,因此允许完全忽略对复制构造函数的调用提供一个合适的存在并且可以访问。

答案 2 :(得分:2)

在第一个中,您正在隐式地调用默认构造函数 。在第二个中你明确地称之为

答案 3 :(得分:1)

后者可以调用复制构造函数,因此需要一个公开。

编辑:我当然从您使用的类型名称中得出了太大的结论。上述句子仅适用于类型(即不是POD)。对于POD类型,前者使变量未初始化,而后者使用所谓的“默认”值初始化它。