重新梳理一下知识
C++自动提供的成员函数,有:默认构造函数,复制构造函数,默认析构函数,赋值操作符,地址操作符即this指针
1默认构造函数
c++可以在将创建对象的初始化工作放在函数体内完成
特点:a构造函数是与所在类同名的函数
b构造函数没有返回值
c构造函数可以重载
d构造函数的作用是为类对象的数据成员赋初值
e构造函数又定义类对象时由系统自动调用,不许像其他函数一样直接由用户调用
f构造函数一般是类的public成员
g系统默认的构造函数是X(){} 她只负责对象的创建,不做任何的初始化工作。一点有了构造函数,则系统提供的构造函数不再存在了。
2复制构造函数
用一个以存在的对象来构造一个新的对象,会调用构造函数,这是调用的是一种特殊的构造函数,也就是复制构造函数
同构造函数一样,如果没有定义复制构造函数,系统会提供一个默认的复制构造函数,该默认扶着构造函数会自动完成将一个已知对象的数据成员复制到另一个对象的数据成员中的是所有操作 复制构造函数有一个特点,函数只有一个参数,并且是该类对象的引用。
类名::类名(类名&引用名)
{//函数体}
一般的默认复制构造函数可以完成任务,但是单对象具有一些指成员是许愿自己定义复制构造函数。
指针指向同一的数组型动态堆空间叫做浅复制;
两个对象的指针成员指向不同的动态空间叫做深复制;
何时生成临时对象:
情形1:按值传递对象注意是按值传递对象,按值传递意味着会创建一个原始对象的副本,
情形2:函数反回对象时。
情形3:用一个对象初始化另一个对象时即复制初始化,语句hyong x=y和hyong x=hyong(y)这里y是hyong类型的对象。都将调用复制构造函数,但有可能创建临时对象也有可能不创建临时对象而用复制构造函数直接初始化对象,这取决于编译器。
3默认析构函数
其名字和类名相同,在名字前加~
有如下特点:
a同类名,加~
b没有返回值,无参数,不能重载,访问控制一般问为public
c对象撤销时由系统自己调用
d堆非动态对象,程序执行离开时他的作用域自动被撤销,对动态对象,对齐delete才能撤销
e没定义,自动有一个~X(){}
f调用的次序很构造相反,也就是说后构造先析构
4赋值操作符
赋值操作符即“=”。赋值操作符为二元操作数,其操作目的是将右操作数的值复制给左操作数。由于左值涉及到写操作,因此左值必须为非const量,而右值在赋值操作中只涉及读操作,因此一般为const量。
class A {public: int b; A(){b=1;} A(int i){ b=i;}
const A & operator =(const A & j) //重载赋值运算符必须是类的成员,重载赋值运算符应反回一个类的对象的引用。
{ if( this==&j) return *this; //用this和j的地址来检查是否是对自身的赋值的情况,如果调用赋值运算符函数的地址和被赋值的对象的地址相等,则说明是同一个对象,就反回当前对象。
b=j.b; return *this;} };
5地址操作符即this指针
用处:当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。
使用:一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。
当你进入一个房子后,
你可以看见桌子、椅子、地板等,
但是房子你是看不到全貌了。
对于一个类的实例来说,
你可以看到它的成员函数、成员变量,
但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身