用(*this).ptr而不是x.ptr从对象x复制一个字符串指针到另一个对象



我正在详细学习c++特殊成员。

我正在摆弄一些代码并尝试不同的方法,然后遇到了这个:

#include <iostream>
#include <string>
using namespace std;
class Example5 {
public:
string* ptr;
public:
Example5 (const string& str) : ptr(new string(str)) {}
~Example5 () {delete ptr;}
// copy constructor:
Example5 (const Example5& x) : ptr(x.ptr) {}
};
int main () {
Example5 foo ("Example");
Example5 bar (foo);
cout << foo.ptr << endl << bar.ptr;
return 0;
}

下面的代码显示了一个具有预期结果的对象的浅拷贝:

0x505348
0x505348

虽然这段代码似乎没有执行浅拷贝:

// copy constructor: deep copy
#include <iostream>
#include <string>
using namespace std;
class Example5 {
public:
string* ptr;
public:
Example5 (const string& str) : ptr(new string(str)) {}
~Example5 () {delete ptr;}
// copy constructor:
Example5 (const Example5& x) : ptr((*this).ptr) {}
};
int main () {
Example5 foo ("Example");
Example5 bar (foo);
cout << foo.ptr << endl << bar.ptr;
return 0;
}

结果如下:

0x505348
0x505278 

*this不只是指向对象和它的成员吗?

我正期待同样的结果。

您是正确的,第一段代码只是简单地将ptr的值从一个对象复制到另一个对象。当两个对象超出作用域并被销毁时,这将导致问题,因为它们的析构函数都将尝试delete相同的内存。

在第二段代码中,用(*this).ptr初始化ptr实际上是一个无操作(实际上是未定义行为(因为不能从未初始化的变量中读取值)。由于您是用自身初始化ptr,因此它的最终值将是indeterminate

使复制构造函数deep-copyptr的正确代码是:
Example5 (const Example5& x) : ptr(new string(*(x.ptr))) {}

或者,在c++ 11及以后的版本中,您可以委托给接受string的其他Example5构造函数:

Example5 (const Example5& x) : Example5 (*(x.ptr)) {}

另外,请确保添加一个可行的副本分配operator=Example5,以完成规则3的实现。

相关内容

  • 没有找到相关文章

最新更新