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++编译系统会自动调用析构函数
注意析构函数体内并不是删除对象,而是做一些清理工作