自己调用拷贝构造函数
Calling copy constructor on yourself
我很好奇这段我差点误写的代码发生了什么:
#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 不会在那一行停止(设置到那一行的断点跳转到下一行)。
如果将 "complex" 属性添加到 class(如 std::string
),一切都会中断,可能是因为“=”运算符如何为此类 [=23= 重载]es.
我的假设是否正确?为什么 gdb 不在那一行停止?为什么在使用未初始化的对象调用复制构造函数时没有警告?
由于您有一个 int
类型的成员变量,其不确定值被复制到自身,代码在技术上是未定义行为。
但是,实际上,使用当前的计算机不会发生任何坏事。但另一方面,也没有什么好事发生。
关于警告,这是实施质量问题。 C++ 标准对此无话可说。
我很好奇这段我差点误写的代码发生了什么:
#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 不会在那一行停止(设置到那一行的断点跳转到下一行)。
如果将 "complex" 属性添加到 class(如 std::string
),一切都会中断,可能是因为“=”运算符如何为此类 [=23= 重载]es.
我的假设是否正确?为什么 gdb 不在那一行停止?为什么在使用未初始化的对象调用复制构造函数时没有警告?
由于您有一个 int
类型的成员变量,其不确定值被复制到自身,代码在技术上是未定义行为。
但是,实际上,使用当前的计算机不会发生任何坏事。但另一方面,也没有什么好事发生。
关于警告,这是实施质量问题。 C++ 标准对此无话可说。