拷贝函数中为何要用引用的小疑点
拷贝函数中为何要用引用的小问题
定义了一个类,
class Mypolm
{
public:
Mypolm();//构造函数;
virtual ~Mypolm();// 析构函数;
Mypolm(const Mypolm<elemtype>& otherL);//拷贝函数
Mypolm<elemtype> operator=(Mypolm<elemtype> &rightL);
class LinkNode//类里面嵌套了一个类
{
public:
class data//数据项既包含系数又包含指数,用一个类来定义
{
public:
float coef;
int expn;
}d;
LinkNode *next;
};
LinkNode * head;
LinkNode * gethead();//得到头指针head
......
}
小弟有三个问题:
第一,为何这个拷贝函数的形参要用引用 & otherL。
Mypolm(const Mypolm<elemtype>& otherL);//拷贝函数
第二,为何成员函数在函数中形参带有const后
Mypolm(const Mypolm<elemtype>& otherL)
{
p=otherL.head;//这一步,为何不能写成p=otherL.gethead();
}
第三。为何成员函数形参不是const的时候,就可以调用成员函数gethead(),
Mypolm<elemtype>::operator=(Mypolm<elemtype> &rightL)
{
NodePointer p;
p=rightL.gethead();//为何在此处,调用成员函数gethead(),和直接p=rightL.head都可以呢
}
高手指点一下,为何加上const和不加const,一个就必须要直接用p=rightL.head来获取头指针,而另一个可以用此直接,或者用成员函数gethead(),这是为什么。
真诚求助,我只是找到错误并改正了,但是不知道为何。
谢谢
------解决方案--------------------
1. 如果不是引用的话,那就得是值类型,这样的话使用源对象初始化该参数的时候,就需要执行复制构造,而正在调用却是复制构造函数,这就造成了鸡生蛋,蛋生鸡的问题了。
2. otherL 是 const 的,只能调用 const 成员函数,gethead 是 non-const 成员函数。
3. rightL 是 non-const 对象,所以可调用 gethead.
------解决方案--------------------
就是函数调用时,要对形参赋值,如果直接作传值调用,则需要将实参复制给形参,这个复制的过程又需要用到拷贝函数……这不就又回到拷贝函数执行的开始了?所以是个死循环了。
定义了一个类,
class Mypolm
{
public:
Mypolm();//构造函数;
virtual ~Mypolm();// 析构函数;
Mypolm(const Mypolm<elemtype>& otherL);//拷贝函数
Mypolm<elemtype> operator=(Mypolm<elemtype> &rightL);
class LinkNode//类里面嵌套了一个类
{
public:
class data//数据项既包含系数又包含指数,用一个类来定义
{
public:
float coef;
int expn;
}d;
LinkNode *next;
};
LinkNode * head;
LinkNode * gethead();//得到头指针head
......
}
小弟有三个问题:
第一,为何这个拷贝函数的形参要用引用 & otherL。
Mypolm(const Mypolm<elemtype>& otherL);//拷贝函数
第二,为何成员函数在函数中形参带有const后
Mypolm(const Mypolm<elemtype>& otherL)
{
p=otherL.head;//这一步,为何不能写成p=otherL.gethead();
}
第三。为何成员函数形参不是const的时候,就可以调用成员函数gethead(),
Mypolm<elemtype>::operator=(Mypolm<elemtype> &rightL)
{
NodePointer p;
p=rightL.gethead();//为何在此处,调用成员函数gethead(),和直接p=rightL.head都可以呢
}
高手指点一下,为何加上const和不加const,一个就必须要直接用p=rightL.head来获取头指针,而另一个可以用此直接,或者用成员函数gethead(),这是为什么。
真诚求助,我只是找到错误并改正了,但是不知道为何。
谢谢
------解决方案--------------------
1. 如果不是引用的话,那就得是值类型,这样的话使用源对象初始化该参数的时候,就需要执行复制构造,而正在调用却是复制构造函数,这就造成了鸡生蛋,蛋生鸡的问题了。
2. otherL 是 const 的,只能调用 const 成员函数,gethead 是 non-const 成员函数。
3. rightL 是 non-const 对象,所以可调用 gethead.
------解决方案--------------------
就是函数调用时,要对形参赋值,如果直接作传值调用,则需要将实参复制给形参,这个复制的过程又需要用到拷贝函数……这不就又回到拷贝函数执行的开始了?所以是个死循环了。