this和复制构造函数



this指针


我们在声明一个类的时候,编译器是不会为这个类申请一个空间的,只有创建这个类的实例—对象,才会为对象分配空间。我们定义了多个对象,每一个对象都有自己的存储空间。但是所有对象都是公用成员方法的,那么问题就来了,不同的对象怎么调用不同的方法操作的是自己的数据成员呐?


如下面每一个对象都调用了相同的成员函数,但是成员函数的实现却只有一个,其实在每一个成员函数中,都包含一个特殊的指针—this指针。我们通过一个对象调用一个成员函数,编译器就将对象的起始地址赋值给成员函数的this指针,在成员函数内部,通过this指针来操作对象的数据成员。


pointer1.png


1.this指针是指向本类对象的指针,它作为参数传递给成员函数;


2.由编译器自动实现,程序员不必人为的在形参中添加this指针。


在上一个章节中我们省略了this指针的书写,由于this是一个指针,所以需要通过->来访问它的成员。因为this是一个指向调用该成员函数的对象的指针,那么*this就是这个对象,这样,我们也可以通过.来调用它的成员。下面两句话是等效的。大家要注意那一个括号,.运算符的优先级比较高。所以必须添加括号使*和tnis先结合。this指针我们一般不会使用,只有在一些场合才会显式地使用。


pointer2.png



 复制构造函数


复制构造函数是一种特殊的构造函数,在创建一个新的对象时将其他对象作为参数时,编译器将会调用复制构造函数。不提供时使用默认复制构造函数。默认复制构造函数内部为各个成员变量赋值。在我们创建了自己的复制构造函数之后,系统就不会为我们添加默认构造函数了。


创建之后,新对象是老对象的副本,二者值相同。但具有不同的存储空间。


形式:


CTime(CTime& time); //复制构造函数的声明形式


注意:复制构造函数的参数必须是传引用,如果变成传值,对象作为函数参数传值会调用赋值构造函数,就会形成一个循环。


如下代码:该构造函数实现的功能和系统为我们预定义的构造函数的功能是一样的,各自为它们的数据成员赋初值。复制构造函数需要两个参数,左操作数为调用它的对象,而右操作数为它的参数。


pointer3.png


CTime time;
CTime time2(time);  //使用已有的对象创建一个新的构造函数,复制构造函数被调用。使两个对象的数据成员完全一样。


调用复制构造函数的时机:


1.以其他对象作为参数创建新对象时;


2.类对象(传值方式)作为函数参数时。


①号区域将会是第一种情况调用复制构造函数,而二号区域是第二种情况调用它。


pointer4.png


运行结果如下:


pointer5.png


③.类对象作为函数返回值时


Func函数返回了一个对象,编译器产生了一个临时对象,造成了对象的复制。


pointer6.png



【本文由麦子学院独家原创,转载请注明出处并保留原文链接】

logo
© 2012-2016 www.maiziedu.com
蜀ICP备13014270号-4 Version 5.0.0 release20160127

有一位课程导师想与你聊聊

客服热线 400-862-8862

回到顶部