简单的C++拷贝类构造函数问题
答案:2 悬赏:0
解决时间 2021-03-14 18:59
- 提问者网友:先森请一心
- 2021-03-14 10:41
下面是一个简单的拷贝类构造函数:
clock::clock(clock &c1)
{
h=c1.h;
cout<<"。。。。。。。。。。"<<endl;
}
如果clock c(1),b=c;运行后会输出"。。。。。。。。。。"
如果clock c(1),b;b=c;运行后不会输出"。。。。。。。。。。"
为什么?
最佳答案
- 二级知识专家网友:陪衬角色
- 2021-03-14 12:06
拷贝构造函数多被用来实现类对象的深拷贝。
例如:
class A
{
private:
char *p;
public:
A()
{
p=new char[10];
}
}
不定义拷贝构造函数时,你如果对两个对象赋值,就会是浅拷贝,即:简单的成员变量相等。
A a,b;
a=b;
则,相当于作了a.p=b.p,a,b的p指针指向了同一个地址,但是数据并没有拷贝一份,这叫做浅拷贝。
所以定义拷贝构造函数:
A(A& a)
{
p=new char[strlen(a.p)+1];
strcpy(p,a.p);
}
然后再作a=b或者A a(b),作的就是上面函数了,p就有a.p,b.p两个数据拷贝,不至于在释放时一个空间被释放两次。
拷贝构造函数在大多数情况下就用来做这种事。
所以如果没有指针变量,一般就不需要自己定义拷贝构造函数。因为系统默认的拷贝构造函数可以实现浅拷贝。而一般常量(只要不是指针),浅拷贝和深拷贝效果一样。
例如:
class A
{
private:
char *p;
public:
A()
{
p=new char[10];
}
}
不定义拷贝构造函数时,你如果对两个对象赋值,就会是浅拷贝,即:简单的成员变量相等。
A a,b;
a=b;
则,相当于作了a.p=b.p,a,b的p指针指向了同一个地址,但是数据并没有拷贝一份,这叫做浅拷贝。
所以定义拷贝构造函数:
A(A& a)
{
p=new char[strlen(a.p)+1];
strcpy(p,a.p);
}
然后再作a=b或者A a(b),作的就是上面函数了,p就有a.p,b.p两个数据拷贝,不至于在释放时一个空间被释放两次。
拷贝构造函数在大多数情况下就用来做这种事。
所以如果没有指针变量,一般就不需要自己定义拷贝构造函数。因为系统默认的拷贝构造函数可以实现浅拷贝。而一般常量(只要不是指针),浅拷贝和深拷贝效果一样。
全部回答
- 1楼网友:蜜罐小熊
- 2021-03-14 13:00
问题:
如果clock c(1),b=c;运行后会输出"。。。。。。。。。。"
如果clock c(1),b;b=c;运行后不会输出"。。。。。。。。。。"
回答:
情况1:
clock c(1) //调用clock::clock c(int)
情况2:
clock c(1)
clock b=c; //调用clock::clock c(clock &t) 初始化的赋值是调用复制构造函数
情况3
clock c(1),b;
b=c; //调用clock operator = (clock &t1, clock &t2) 或者 clock clock ::operator =(clock &t)
//这里就没有调用构造函数了
输出就不用详细说了
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯