gpt4 book ai didi

c++ - 为什么拷贝构造函数不需要检查输入对象是否指向自己?

转载 作者:行者123 更新时间:2023-12-01 14:20:15 28 4
gpt4 key购买 nike

如下面的代码,复制赋值运算符必须检查输入对象是否指向它自己。我想知道为什么复制构造函数不需要做同样的检查。

我是 C++ 的新手。如果能在这个问题上提供一些帮助,我将不胜感激。

  class rule_of_three
{
char* cstring; // raw pointer used as a handle to a dynamically-allocated memory block

void init(const char* s)
{
std::size_t n = std::strlen(s) + 1;
cstring = new char[n];
std::memcpy(cstring, s, n); // populate
}
public:
rule_of_three(const char* s = "") { init(s); }

~rule_of_three()
{
delete[] cstring; // deallocate
}

rule_of_three(const rule_of_three& other) // copy constructor
{
init(other.cstring);
}

rule_of_three& operator=(const rule_of_three& other) // copy assignment
{
if(this != &other) {
delete[] cstring; // deallocate
init(other.cstring);
}
return *this;
}
};

最佳答案

赋值有时会发生,这是正常使用类的一部分。

将一个尚未构造的对象作为参数传递给它自己的复制(或移动)构造函数是不正常的。虽然本身不​​是未定义的行为1,但没有充分的理由这样做,而且通常不会发生。它可能是偶然发生的,或者如果有人故意试图破坏你的类(class)。

因此,传统上复制(和移动)构造函数不会检查 &other != this

但是如果你想要一些额外的安全,没有什么能阻止你这样做:

rule_of_three(const rule_of_three& other) // copy constructor
{
assert(&other != this);
init(other.cstring);
}

1 [basic.life]/7似乎允许这样做,只要您不访问尚未构建的对象本身。允许使用 & 获取它的地址。

关于c++ - 为什么拷贝构造函数不需要检查输入对象是否指向自己?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62100593/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com