钻进魔术师的帐篷看对象的前世今生--------C++之对象


1. this指针

在C++中,类对象模型中实际只包含了该对象的数据信息。那么问题来了,用Person类分别创建三个对象p1,p2,p3,然后调用SetPersonInfo函数来设置每个对象的具体信息,但是SetPersonInfo函数只有一份,函数中没有区分不同对象的任何标志,为什么当P1在调用该函数的时候,函数就知道去设置P1的信息而不会去设置P2?实际上,C++中的成员函数也是按照C类似方式来处理的,即:成员函数实际也有一个隐藏的指针,指向了调用该函数的对象本身。

this指针的特性:

        大笑this指针的类型:类类型*const

        大笑this指针并不是对象本身的一部分,不影响sizeof的结果

        大笑this的作用域在类非静态成员函数(静态成员函数没有this指针)的内部

        大笑this指针是“l类成员函数”的第一个默认隐含参数,编译器自动维护传递,类编译者不能显式传递

        大笑只有在类的非静态成员函数中才可以使用this指针,其它任何函数都不可以

2. 六个默认的成员函数 

空类里边有什么?空类里边有6个默认的成员函数,构造函数,拷贝构造函数,析构函数,赋值操作符重载,取地址操作符重载,const修饰的取地址操作符重载

一:构造函数:

       构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,在对象的生命周期里只调用一次,保证每个数据成员都有一个合适的初始值。

来看一个日期类:

class Data{
public:
	Data(int year = 2017,int month = 1,int day=1){
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

构造函数的特性:

a)  函数名和类名相同

b)  没有返回值

C)新对象被创建时,由编译器自动调用,且在对象的生命周期内仅调用一次

d) 构造函数可以重载,实参决定了调用哪个构造函数

d) 无参构造函数和带有缺省值的构造函数都认为是缺省的构造函数,并且缺省的构造函数只能有一个

e)有初始化列表

f)构造函数不能用const修饰,因为const修饰成员函数,实际上修饰了this指针。

g)构造函数不能为虚函数。

h) 如果没有显式定义,编译器会合成一个默认的构造函数(需要时合成)

注意:类中包含以下成员,一定要放在初始化列表中进行初始化:

引用成员变量,const成员变量,类类型成员(该类有非缺省的构造函数)

构造函数的作用:

构造&初始化对象

类型转换:对于单个参数的构造函数,可以将其接受参数转化成类类型对象,用explicit修饰构造函数,可抑制由构造函数定义的隐式转换.

二:拷贝构造函数

只有单个形参,而且该形参是对本类类型对象的引用,(常用const修饰),这样的构造函数称为拷贝构造函数,拷贝构造函数是特殊的构造函数,创建对象时使用已经存在的同类对象来进行初始化,由编译器自动调用。

class Data{
public:
	Data(int year = 2017,int month = 1,int day=1){//构造函数
		_year = year;
		_month = month;
		_day = day;
	}
	Data(const Data&d)//拷贝构造函数
		:_year(d._year)
		, _month(d._month)
		, _day(d._day)
	{

	}
private:
	int _year;
	int _month;
	int _day;
};
int main(){
	Data d1(2017,1,1);
	Data d2(d1);

特征:

拷贝构造函数是构造函数的重载,构造函数的性质拷贝构造函数均满足

参数必须使用类类型对象引用传递,因为值传递时会生成临时对象,生成临时对象又要调用拷贝构造函数,每次调用拷贝构造函数又要生成临时对象,递归,没有出口。

三:析构函数

析构函数:与构造函数相反,在对象被销毁时,由编译器自动调用,完成类的一些资源清理和汕尾工作

~Data(){//析构函数

	}

特性:

析构函数在类名(即构造函数名)加上字符~

析构函数无参数无返回值

一个类有且只有一个析构函数,若未显示定义,系统会自动生成缺省的析构函数(并不是所有的都合成)

对象生命周期结束时,C++编译系统会自动调用析构函数

注意析构函数体内并不是删除对象,而是做一些清理工作


猜你喜欢

转载自blog.csdn.net/superwangxinrui/article/details/80857523