在自己上调用复制构造函数

时间:2015-02-18 18:17:37

标签: c++ gdb copy-constructor

我很好奇这个代码中发生的事情几乎是我错误写的:

#include <iostream>

class Test
{
public:
  Test() {
    std::cout << "Default constructor";
    a= 10;
  }
  int a;
};

int main() {
  Test obj(obj);
  std::cout << obj.a << std::endl;
}

它在没有任何警告的情况下编译gcc(使用-Wall -Werror)。 执行它只打印垃圾。

如果我没有弄错的话,这就是调用隐式的复制构造函数,而不是初始化。我很好奇复制构造函数在这种情况下会做什么,但gdb不会在该行停止(设置为该行的断点跳转到下一行)。

如果&#34;复杂的&#34;属性被添加到类中(如std::string),可能是因为&#39; =&#39;这些类的运算符超载。

我的假设是否正确?为什么gdb不会停在该行?为什么在使用未初始化的对象调用复制构造函数时没有警告?

1 个答案:

答案 0 :(得分:7)

由于您有一个int类型的成员变量,其不确定值被复制到自身,因此代码在技术上是未定义的行为。

然而,在实践中,使用当前的计算机不会发生任何不好的事情。但在第三方面,也没有任何好处发生。

关于警告,这是“执行质量”问题。 C ++标准没有什么可说的。