首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

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

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

关于复制控制成员的一点疑问
本帖最后由 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的原则,除非该类自己分配有内存,否则不需要。

热点排行