C++中复制构造函数的问题

来源:百度知道 编辑:UC知道 时间:2024/05/07 21:22:18
class SimpleCircle
{
public:
SimpleCircle();
SimpleCircle(const SimpleCircle &);
~SimpleCircle();
int GetRadius() const {return *itsRadius;}
void SetRadius(int a){*itsRadius=a;}
private:
int *itsRadius;
};

SimpleCircle::SimpleCircle()
{
itsRadius=new int;
*itsRadius=5;
}
SimpleCircle::SimpleCircle(const SimpleCircle & rhs)
{
itsRadius=new int;
*itsRadius=rhs.GetRadius();

SimpleCircle::~SimpleCircle()
{
delete itsRadius;
itsRadius=0;
}
但是答案上写的复制构造函数是:
SimpleCircle::SimpleCircle(const SimpleCircle & rhs)
{
int val=rhs.GetRadius();
itsRadius=new int(val);
}
我不明白为什么要重新定义个变量val,也不明白为什么要分配内存空间,那么不按照这个答案,我上面的复制构造函数对不对?

你的复构造函数没有错,而答案的写法也没有错,表达的都是一个意思。
SimpleCircle::SimpleCircle(const SimpleCircle & rhs)
{
itsRadius=new int;
*itsRadius=rhs.GetRadius();

你的思路是先开辟内存,然后给内存赋值,初始化对象的数据成员指针所指的值itsRadius。

SimpleCircle::SimpleCircle(const SimpleCircle & rhs)
{
int val=rhs.GetRadius();
itsRadius=new int(val);
}
而答案的思路是先把值存到局部变量中,然后开辟内存,同时用这个值初始化内存空间,将新开辟的内存空间地址返回给对象的数据成员istRadius。

两种表达结果都一样:
itsRadius=new int(val);
相当于
itsRadius=new int;
*itsRadius=val;

就是itsRadius = new int(rhs.GetRadius());...

那种写法纯属吃多了...

1.不一定要定义val,也可以这样链式表达itsRadius=new int(rhs.GetRadius());
2.必须分配内存空间,因为在调用析构函数时,要delete,所以必须配对,你写的没有问题。