C++对象实例化与赋值

17 浏览
0 Comments

C++对象实例化与赋值

这两者之间有什么区别:

TestClass t;

和这个:

TestClass t = TestClass();

我本来以为第二个会调用两次构造函数,然后调用 operator=,但实际上它只调用了一次构造函数,就像第一个一样。

admin 更改状态以发布 2023年5月23日
0
0 Comments

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

第二种情况是构造一个匿名对象,然后调用复制构造函数。请注意,这里的=不是赋值,它类似于(但不是相同)写作:

TestClass t(TestClass());

我们可以通过使其无效来验证这需要可用的复制构造函数,例如:

#include 
struct TestClass {
  TestClass() { std::cout << "Ctor" << std::endl; }
  TestClass(const TestClass&)  = delete;
};
int main() {
  TestClass t = TestClass();
}

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

实际上最有可能发生的情况是,您的编译器正在执行返回值优化,只要存在并且可访问合适的复制构造函数,就可以省略对它的调用。

0
0 Comments

TestClass t;

调用默认构造函数。

TestClass t = TestClass();

是一个复制初始化。它将为TestClass()调用默认构造函数,然后调用复制构造函数(理论上,复制是受到复制省略的影响的)。这里不进行复制赋值

还有直接初始化的概念:

TestClass t(TestClass());

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

TestClass t;
TestClass s;
t = s;

0