c++ - 自己调用拷贝构造函数

标签 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 不会在那一行停止(设置到那一行的断点跳转到下一行)。

如果将“复杂”属性添加到类(如 std::string),一切都会中断,这可能是因为“=”运算符如何为此类类重载。

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

最佳答案

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

然而,在实践中,当前的计算机不会发生任何坏事。但另一方面,也没有什么好事发生。

关于警告,这是实现质量问题。 C++ 标准对此无话可说。

关于c++ - 自己调用拷贝构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28590937/

相关文章:

c++ - const char* 与 const char[]

gdb:如何加快对非常大的二进制文件的调试?

linux - 如何使用 gdb 在当前指令指针之前(上一个)打印指令?

c++ - 单元测试拷贝构造函数和赋值运算符

c++ - 删除复制构造函数和 operator= 类作用域访问

C++ push_back, non const 复制构造函数

c++ - 从 Windows 网络位置打开文件

c++ - 基于范围的 for 循环的对象生命周期问题

c++ - 在 C++ 中动态引用不同类型的变量?

c++ - CLion STL 容器无法在 Fedora 23 上的调试器中正确显示