引用,this指针,构造与析构

引用:

曾经,我们把引用这个词作为一般意义上的动词使用,如“引用一个变量”,它的含义相当于“使用”或者“调用”。而我们这里说的引用不是一个动词,而是c++中一个专名名词,有特定的含义。

 


对一个数据可以建立一个“引用”,它的作用是为一个变量其一个别名。这是C++对c的一个重要扩展。加入有一个变量a,想给他起一个别名b,就可以这样写:
int a;//定义a的整型变量
int &b = a;//声明b是a的引用
以上声明了b是a的引用,即b是a的别名。经过这样的声明过后,使用a或b的作用相同,都代表同一变量。可以这样理解引用:通过b可以引用a。


注意:在上述声明中,&是引用声明符,并不代表地址。不要理解为“把a的值赋给b的地址”。在数据类型名后面出现的&是引用声明符,在其他场合出现的都是地址符,如
char &d = c;//此处是引用声明符
int *p = &a;//此处是地址符
声明b为引用,并不需要另外开辟内存来存放b的值。b和a在内存中占同一存储空间,他们具有同一地址。声明b是a的引用,可以理解为:使变量b具有变量a的地址。


注意:1.引用不是一种独立的数据类型。对引用只有声明,没有定义。必须先定义一个变量,然后声明对该变量一个引用。
2.声明一个引用时,必须同时使之初始化,即声明它代表哪一个变量。
3.在声明一个引用后,不能再使之作为另一个变量的引用
4.不能建立引用数组。c++中,引用可以说只是某个变量的别名,所谓别名,是和指针类型区分开的:指针类型也可以指向    某个变量,但指针类型本身也是一个变量,而引用实际上不是一个变量。更本质来说,可以理解为引用没有自身的地址,不占用内存空间(这里为了简化问题可以这样考虑)。因此,声明引用数组没有办法分配空间,因为根本就没有空间可以分配给引用。所以不能声明和定义引用数组
5.不能建立引用的引用
6.可以取引用的地址。如已声明b是a的引用,则&b就是变量a的地址&a
int *pt;

 

 

pt = &b;//把变量a的地址赋值给变量pt

 

this指针

在每一个成员函数中都包含了一个特殊的指针,这个指针的名字是固定的,称为this。
它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。例如,当调用成员函数a.volume时,编译系统就把对象a的起始地址赋给this指针,于是在成员函数引用数据成员时,就按照this的指向,找到对象a的数据成员。例如volume函数要计算height*lenght*weight的值,实际上是执行:(this->height)*(this->lenght)*(this->weigth),由于当前this指向a,因此相当于执行:(a.height)*(a.weight)*(a.lenght).
this指针是隐式使用的,它是作为参数被传递给成员函数的,即在成员函数的形参列表中增加了一个this指针。需要说明的是:这些都是由编译器自动实现的,编程序者不必人为地在形参中增加this指针,也不必将对象a的地址传给this。这里写出来只是为了读者理解this指针的作用和实现的机理。

为什么需要this?

因为this作用域是在类的内部,自己声明一个类的时候,还不知道实例化对象的名字,所以用this来使用对象变量的自身。在非静态成员函数中,编译器在编译的时候加上this作为隐含形参,通过this来访问各个成员(即使你没有写上this指针)。

注意事项:
a.this指针不属于对象本身的一部分,不会影响sizeof作用于某个类对象的结果,因为sizeof本身也是求对象所对应的类的大小,与对象无关

b.this指针的作用域在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行

构造函数

在c++程序中,对象的初始化是一个不可缺少而且十分重要的问题,不应该让程序员在这个问题上花费太多的精力,C++在类的设计中提供了较好的方法。
为了解决这个问题,C++提供了构造函数来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。构造函数的名字必须与类名相同,而不能任意命名,以便编译系统能够识别它并把它作为构造函数处理。


在类中定义构造函数Time,它和所在的类同名。在建立对象时自动执行构造函数,根据构造函数Time的定义,其作用是对该对象中的全部数据成员赋予初值0。请不要误以为是在声明类时直接对数据成员赋予初值,赋值语句是写在构造函数的函数体中的,只有在调用构造函数时才执行这些赋值语句,对当前对象中的数据成员进行赋值。
有关构造函数的使用,有以下说明:
1.在建立对象时自动调用构造函数。
2.构造函数没有返回值,也没有类型,它的作用只是对对象进行初始化。
3.构造函数不需要用户调用,也不能被用户调用。
4.可以用一个类对象初始化另一个类对象。
5.一般不提倡在构造函数中加入与初始化无关的内容。

6.如果用户没有自己定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。

析构函数

析构函数也是一种特殊的成员函数,它的作用与构造函数相反,它的名字是类名的前面加一个~符号。在C++中~是取反运算符,从这点可以看出:析构函数是与构造函数作用相反的函数。
当对象的声明周期结束时,系统会自动调用析构函数。
具体有以下4中情况:
1.如果在一个函数中定义了一个对象,当这个函数调用结束时,对象应该释放,在对象释放前自动调用析构函数。
2.静态局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或者调用exit函数结束程序时,才调用static局部对象的析构函数。
3.如果定义了一个全局的对象,则在函数的流程离开其作用域时,调用该全局对象的析构函数。
4.如果用new运算符动态地建立一个对象,当用delete运算符释放该对象时,调用该对象的析构函数。


析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前进行一些清理工作,使这部分内存可以被程序分配给新对象使用。
析构函数没有函数类型,也不返回任何值,也没有函数参数,所以它不能被重载。一个类可以有多个构造函数,但是只能有一个析构函数。
实际上,析构函数的作用并不仅限于释放资源方面,它还可以被用来执行“用户希望在最后一次使用对象之后所执行的任何操作”。
一般情况下,类的设计者应该在定义类的同时定义析构函数,以指定如何完成“清理”的工作。如果用户没有定义析构函数,C++编译系统会自动生成一个析构函数,但它只是徒有析构函数的名称和形式,实际上什么操作也没有。想让析构函数完成任何工作,都必须在定义的析构函数孩中指定。

调用构造函数和析构函数的顺序:先构造的后析构,后构造的先析构。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值