C++语法学习笔记十二:拷贝构造函数

实例代码:


#include <iostream>
#include <string>
#include <vector>

using namespace std;


class Tmpclass{
public:
	Tmpclass(){
		std::cout << "调用了Tmpclass 类的构造函数 " << std::endl;
	}

	Tmpclass(Tmpclass &tmpclass){
		std::cout << "调用了Tmpclass 类的拷贝构造函数 " << std::endl;
	}
};


class Time {

private:
	void initMillTime(int mls) {
		Millisecond = mls;
	}

	int Millisecond; //毫秒
public:
	int Hour; //小时
	int Minute;//分钟
	//int Second;//秒钟

	//int Second = 0;//秒钟  类内初始化
	int Second = { 0 };//秒钟  类内初始化
	mutable int testVal;

	Tmpclass cl;

	//构造函数
	Time(int temphour, int tmpmin, int tmpsec){
		Hour = temphour;
		Minute = tmpmin;
		Second = tmpsec;
		initMillTime(0);

		cout << "调用了构造函数Time(int temphour, int tmpmin, int tmpsec)" << endl;
	}

	Time(int temphour, int tmpmin){
		Hour = temphour;
		Minute = tmpmin;
		Second = 59;
		initMillTime(50);

		cout << "调用了构造函数Time()" << endl;
	}

	explicit Time(){  // //不加参数了
	
	}

	//拷贝构造函数
	Time(const Time &tmptime, int a = 60){
		std::cout << "调用了 Time::Time(Time &tmptime, int a) 拷贝构造函数" << std::endl;
	}

	void addHour(int tmphour) {
		Hour += tmphour;
	}

	void addHour1(int tmphour) const{
		//Hour += tmphour; //报错  这地方不能修改成员变量的值
	}

	void fixVal() const {
		testVal = 10;
	}

	//把对象自己给返回回去了
	Time& add_hour(int tmphour) {
		Hour += tmphour;
		return *this;	//把对象自己给返回去了
	}
};


void func(Time tmptime){
	return;
}

Time func1(){
	Time lineshitime;
	return lineshitime;  //系统产生了临时对象并且调用了类的拷贝构造函数。
}


int main() {

	//一、拷贝构造函数
	int a = 3;
	int b = a; // 普通拷贝的行为
	//默认情况下,类对象的拷贝是每个成员变量逐个拷贝;
	//如果一个类的构造函数,的第一个参数 是所属的类类型的引用,如果还有其他额外参数,
		//那么这些额外的参数还都有默认值,则这个构造函数就叫做拷贝构造函数。
		//函数默认参数必须放在函数声明中,除非该函数没有函数声明。
	//拷贝构造函数的作用:会在一定的时机,被系统自动调用。
	//(1) 建议拷贝构造函数第一个参数总是带着const
	//(2) explicit: 拷贝构造函数一般不要声明成explicit

	//"成员变量逐个拷贝"的功能因为我们自己定义的拷贝构造函数的存在而丢失了作用,或者说我们自己的“拷贝构造函数”
	// 取代了系统默认的每个成员变量逐个拷贝的这种行为

	//a).如果我们没有为类定义一个拷贝构造函数,编译器就会帮我们定义一个“合成拷贝构造函数”;
	//b).如果是编译器给我们合成的拷贝构造函数,这个问题合成拷贝构造函数一般也是讲参数tmptime的成员逐个拷贝到正在创建的对象中。

	//每个成员的类型决定它如果拷贝,比如说成员变量如果是整形的,那么就直接把值拷贝过来,
	//如果成员变量时类类型,那么就会调用这个类的拷贝构造函数来拷贝。

	//c). 如果你自己定义了拷贝构造函数,那么就取代了系统合成的拷贝构造函数,这个时候,你就必须要在你自己的拷贝构造函数中给类成员赋值
		//以免出现类成员没有被赋值就使用的情况发生。

	Time myTime; //这个会调用默认构造函数(不带参数)
	Time myTime2 = myTime;  // 调用了拷贝构造函数 
	Time myTime3(myTime); // 调用了拷贝构造函数
	Time myTime4{ myTime }; // 调用了拷贝构造函数
	Time myTime5 = { myTime };// 调用了拷贝构造函数
	Time myTime6; //这个会调用默认构造函数(不带参数)

	myTime6 = myTime5;

	//还有一些情况会发生拷贝构造函数的调用的情形。
	//(1).将一个对象作为实参传递给一个非引用类型的形参。
	func(myTime);
	//(2).从一个函数中返回一个对象的时候
	Time mytime7 = func1();
	//(3).还有一些其他的情况系统也会调用拷贝构造函数。


	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值