类和对象(二)构造函数、拷贝构造函数、析构函数

前一篇博客补充说明:namespace命名空间通过四饼(::)两个冒号将在namespace中创建的变量使用起来。class则是对对象的声明,过程中并没有开空间(创建变量时开辟的空间和struct关键字一样,遵循内存对齐原则),对对象进行创建。

一、引言

龟虽寿

【东汉】曹操

神龟虽寿,犹有竟时。

腾蛇乘雾,终为土灰。

老骥伏枥,志在千里。

烈士暮年,壮心不已。

盈缩之期,不但在天。

养怡之福,可得永年。

幸甚至哉,歌以咏志。

如果生命的意义就是为了存在,那那些追求长生不老药的人似乎也合情合理。可是无论是在人们眼中与天地同寿的神龟,还是无所不能的腾蛇它们终究会迎来有衰老的一天,但年迈的骏马和年事已高的有志者在即将走到生命的尽头时却都有一颗年轻的心。让我不禁想起生命的伟大就在于生命即将消失的一瞬间他们也能决定自己该如何度过这一瞬间,每个人的生命都于自己的意义与色彩。由此可见生命的意义并不是为了存在,相反,生命的意义并不是单一的,对于每个人来说都别有不同,每个人对生命的感受不一样,所处年龄段不一样,都会对生命的意义有不同的感悟。有人想留名青史,以历史为载体永远活在人们心中,有人想人生苦短,及时行乐,遇到事不慌不忙,沉着面对,展现一种乐观豁达的人生态度,有人任劳任怨,以劳动为荣。虽然每个事物从诞生之初,就已经决定了最后会毁灭。变量的生命周期何尝不是如此,变量创建的意义也并不是单一个,有的变量是用来记录数据的,有的变量是用来反映是否出现异常的,有的变量创建是为了管理数据的,变量的作用域(只能在包含自己的{}中使用。)又何尝不是一种生在江湖、生不由己的无奈。

二、构造函数

世界上有无数的生命,每个生命到达到这个世界的方式或许别有不同,但他们一定都会经历成长历练。构造函数则是对新创建的变量初始化,相当于父母给孩子进行养育和传授基本的生存本领。不然新创建的变量里面存的都是随机值,后面要改的话太麻烦了,毕竟类域中定义的变量一个一个赋值太过于麻烦了。当然在struct中也可以定义构造函数、拷贝构造函数、析构函数。

另外如果只是创建变量不添加参数则不需要带上括号(),否则编译器会认为是个函数。

struct A // struct和class任意一个都可以,A是一个随便取的变量名。
{
public:
	A(int x = 1,int y = 1) // 构造函数:类名()
    //调用方法:A(类名) + (变量名)+()括号内加上传参的值
    //另外如果只是创建变量不添加参数则不需要带上括号(),否则编译器会认为是个函数。
	{
		_x = x;
		_y = y;
	}

    //A(int x = 1,int y = 1);

	A(const A& d) // 拷贝构造函数:类名(引用)
	{
		_x = d._x;
		_y = d._x;
	}

	~A() // 析构函数:与构造函数相反所以有个~
	{

	}

private:
	int _x = 0;
	int _y = 0;
};

//A::A(int x,int y)
//{
	//_x = x;
	//_y = y;
//}

构造函数可以在类域内定义,也可以在类域外定义,当然在类外定义肯定要在类域内声明,在类外定义时定义时记得在函数名前加上类名和四饼(::)区域访问限定符。当然也可以在函数中加入缺省参数(令形参 = 一份数据,如果没有传值,系统就会默认一份数据作为形参初始化)(在函数的声明如果函数声明和定义分开,则只在声明中加入缺省参数即可中加入缺省参数,如果想不传参,或是后面(从右往左且缺省参数必须连续,不然编译器判断不出那些值需要缺省参数,编译器是根据顺序来的,而不是根据自动识别那些有缺省参数,那些没有缺省参数。这样是为了追求效率。)几个参数不想传就可以使用缺省参数简化传参。)构造函数调用就非常简单了:创建变量时后加(),括号内加上传参的值。此外任何在类域中定义或是声明的函数,都隐藏着一个this指针,这this指针就像门禁卡一样,没有this指针,就无法调用类域中的函数,this指针也可以省略不写。

三、拷贝构造函数

在一些变量创建过程中,需要其他同类型变量进行初始化,就像我们在成长的过程中拜师学艺以学习技能为自己添姿添彩一样,正所谓“一母生九子,九子各不同。一师授九徒,九徒有相似。”,这个其他的同类型变量就是这个变量的师傅,相当于变量一创建(出生)的时候就获得了高人引进门。在这里我们需要介绍引用,引用于是给相当变量取了一个别名,提供了另一种访问对象的方法。并且这个别名是通过地址解引用来进行访问的,就算是函数中也可以传入对变量的引用来改变变量的值。关于引用有一些要注意的地方:引用必须有初始化过程,并且初始化过程后不能改变,真正实现了朋友一生一起走。使用方式:类型 + &别名 = 已存在的变量名。

在函数传参中函数往往需要拷贝建立一个形参,有了引用之后,能用引用尽量用引用可以减少拷贝。在函数传参中建立自定义类的形参就是拷贝,那么如果我们在拷贝构造函数调用过程中使用形参,无疑会造成无限递归,因为拷贝构造形参就需要调用拷贝构造函数,而调用拷贝构造函数需要建立形参并对形参进行拷贝,所以我们需要用引用来代替形参。将引用的对象一个一个赋值给类域中的变量。

四、析构函数

析构函数从析构函数的函数名(~ + 类名)就可以发现他的功能,析构函数是在变量要被销毁时调用的函数,执行销毁数据之前的处理,比如说向内存池和堆中申请空间。“生命有时尽”,析构函数相当于给变量处理后事。

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值