【发布时间】:2023-04-03 05:22:01
【问题描述】:
今天在大学里,一位教授推荐我在复制构造函数中检查(this != &copy),类似于重载operator= 时应该如何检查。但是我对此提出了质疑,因为我想不出在构造对象时this 会等于参数的任何情况。
他承认我的观点很好。所以,我的问题是,执行此检查是否有意义,或者这不可能搞砸?
编辑:我想我是对的,但我会暂时把它打开。也许有人想出了一些疯狂的神秘 C++ 魔法。
Edit2:Test a(a) 在 MinGW 上编译,但不是 MSVS10。 Test a = a 两者都编译,所以我认为 gcc 的行为会有些相似。不幸的是,VS 确实不显示带有“未初始化的变量使用”的调试消息。但是,它确实为int i = i 正确显示了此消息。这真的可以被认为是一个 c++ 语言缺陷吗?
class Test
{
Test(const Test ©)
{
if (this != ©) // <-- this line: yay or nay?
{
}
}
Test &operator=(const Test &rhd)
{
if (this != &rhd) // <-- in this case, it makes sense
{
}
}
};
【问题讨论】:
-
我想这一定是你教授的愚人节玩笑。
-
std::string x(x);的可能重复
-
您的教授可能不掌握 C++,不应该教它。如果您使用的是复制和交换习语,则几乎从不需要检查自分配。 [我说“几乎”是因为它是(过早的)优化的一种形式。]。如果你不知道复制和交换习语,你必须学习它,并且学习不要写那些令人毛骨悚然的代码重复自分配测试内存泄漏异常不安全15行长赋值运算符。
-
@dialer:为什么会有缺陷?我认为这没有任何问题。
-
@ybungalobill 因为它使您能够创建一个对象(第二个
a)而无需为其调用任何构造函数(甚至不是默认构造函数)。然后,当您复制未构造的对象时,您所有的 RAII 努力都将被搞砸。更糟糕的是,如果不进一步检查,代码甚至不会崩溃,直到销毁原始的&copy对象。当然,这些分配只不过是错误,但 IMO 也应该将它们视为 错误,K&R C 已经。甚至复制和交换也可能搞砸设备句柄等。
标签: c++ class copy-constructor