读书人

关于复制统制成员的一点疑问

发布时间: 2013-01-18 10:22:42 作者: rapoo

关于复制控制成员的一点疑问
本帖最后由 wsfxzxb 于 2012-12-19 12:55:20 编辑 对于如下的类,实现默认构造函数和必要的复制控制成员

class TreeNode 
{
public:
// ...

private:
string value;
int count;
TreeNode *left;
TreeNode *right;
};

我做的答案包括默认构造函数和复制构造函数、赋值操作符和析构函数。但是我看了答案后发现它并没有包括赋值操作符,为什么赋值操作符没有必要实现(或是书上有失误,忘记了写),我觉得赋值操作符应该要自定义呀。请大神们给讲解下。
我的答案如下:
class TreeNode 
{
public:
TreeNode():count(0),left(0),right(0){} // 默认构造函数
TreeNode(const TreeNode &tn) // 复制构造函数(复制指针指向的对象)
{
value=tn.value;
count=tn.count;
left=(tn.left==0) ? 0 : new TreeNode(*tn.left);
right=(tn.right==0) ? 0 : new TreeNode(*tn.right);
}
TreeNode& operator=(const TreeNode &tn) // 赋值操作符
{
value=tn.value;
count=tn.count;
*left=*tn.left;
*right=*tn.right;
return *this;
}
~TreeNode() // 析构函数(删除new分配的指针)
{
if(left)
delete left;
if(right)
delete right;
}
private:
string value;
int count;
TreeNode *left;
TreeNode *right;
};

[解决办法]
如果类中没有定义赋值操作符,编译器会自动合成一个。
可以参考《c++ primer》第13章,有详细讲解。
[解决办法]
这个TreeNode 应该只是指向别的地方,他们不会分配内存的,并非是指针就得重定义 = 构造函数 ..等。

按谁new谁delete的原则,除非该类自己分配有内存,否则不需要。

读书人网 >C++ Builder

热点推荐