MOOC北大 第二周C++作业——奇怪的类复制

作业:奇怪的类复制

#include <iostream>
using namespace std;
class Sample {
public:
	int v;
// 在此处补充你的代码 
	Sample(){
	}
	
	Sample(int j){
		v = j ;	
	}
	Sample(const Sample & f){
		v = f.v + 2;
	}
	
// 在此处补充你的代码
};
void PrintAndDouble(Sample o)
{
	cout << o.v;
	cout << endl;
}
int main()
{
	Sample a(5);
	Sample b = a;
	PrintAndDouble(b);
	Sample c = 20;
	PrintAndDouble(c);
	Sample d;
	d = a;
	cout << d.v;
	return 0;
}

        在main函数中,Sample a(5);应使用含一个int型的参数对此对象进行初始化,Sample b = a;并不是一个赋值语句,而是利用对象a对b进行初始化,此时需要一个复制构造函数来使用对象a中的参数对b进行初始化,Sample d;定义了一个对象而未对其进行初始化,那么就会自动调用一个默认的构造函数来对其进行初始化,因为已经定义了其他有参数的构造函数,那么定义一个无参的空的默认构造函数是不可省略的。在使用函数PrintAndDouble( )时,函数使用的形参是一个对象,输出的结果是对象的一个参数,那么就需要一个复制构造函数来对此对象进行初始化。

        输出结果为9  22  5,先看对象d,对象d是由对象a对其赋值得到的,对象间的赋值并不会导致赋值构造函数被调用,,在程序执行过程中也并未对a的参数进行修改,所以d.v应与a.v一致,即有a.v = 5;那么此a所使用的含有一个参数的构造函数应将括号内的5的值赋给a.v,即有:

	Sample(int j){
		v = j ;	
	}

        Sample c = 20;是用一个int型的常量对其进行初始化,而c是一个对象,所以需要一个构造函数将int型的参数赋值给对象c的参数c.v;利用以上的含一个构造函数就能够实现,此时c.v = 20;经过函数PrintAndDouble(c)后,c.v的值变为了22,说明了调用函数PrintAndDouble时所使用的赋值构造函数把c.v的值增加了2,所以定义的复制构造函数应如下:

	Sample(const Sample & f){
		v = f.v + 2;
	}

        现在我们来看下对象b的操作过程,Sample b = a;用对象a来初始化对象b,会调用复制构造函数,初始化后b.v = 7,执行PrintAndDouble(b)函数时又一次调用复制构造函数,输出结果时b.v  =9;

运行结果:


        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值