一、. 类中的几个默认的函数及其特点
默认的函数及其特点:不提供,系统提供;自己提供 ,系统不提供
1.构造函数
定义:是一个特殊的成员函数,名字与类名相同,创建类 类型对象时,由编译器自动调用,在对象的生命周期内有且只调用一次,以保证每个数据成员都有一个合适的初值。(它的功能由用户定义,在类对象进入作用域时间调用构造函数)。
(1)函数名与类名相同--不能任意命名,否则编译器就不知道它是构造函数
(2)没有返回值。
(3)有初始化列表(可以不用,按变量声明的顺序来初始化)--一般声明为public
(4)新对象被创建,由编译器自动调用,且在对象的生命期内仅调用一次。构造函数不依赖对象调动,且不能手动调动,否则因为第一个对象无法生成;
(5)构造函数可以重载,实参决定了调用那个构造函数。
(6)如果没有显式定义时,编译器会提供一个默认的构造函数。
(7)无参构造函数和带有缺省值得构造函数都认为是缺省构造函数,并且缺省构造函数只能有一个。
(8)构造函数不能用const来修饰,因为const修饰的是this指针,加上const之后就无法对对象的值进行赋值。
(9)构造函数不能用static修饰,因为静态函数没有this指针。
在构造函数体内可以使用this指针,在初始化列表中不能使用this指针。因为在初始化列表阶段还不知道对象的成员如何布局,因此无法访问。
类中包含以下成员时必须要在初始化列表中初始化:
(1)引用数据成员:因为引用必须在定义时初始化,且不可重新赋值。
(2)const数据成员:因为它必须初始化,不能赋值。
(3)类类型成员(该类没有缺省的构造函数,有构造函数):因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化。
2.析构函数
析构函数:与构造函数功能相反,在对象被销毁时,由编译器自动调用,完成类的一些资源清理和结尾工作。
特性:
a、析构函数在类名(即构造函数名)加上字符~,析构函数不能重载;有this指针;
b、析构函数无参数无返回值。
c、一个类有且只有一个析构函数。若未显示定义,系统会自动生成缺省的析构函数。
d、对象生命周期结束时,C++编译系统系统自动调用析构函数。也可以手动调用。
e、注意析构函数体内并不是删除对象,而是做一些清理工作。
3.拷贝构造函数
只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰:拷贝构造函数无限递归穷,导致栈溢出),这样的构造函数称为拷贝构造函数。拷贝构造函数是特殊的构造函数,创建对象时使用已存在的同类对象来进行初始化,由编译器自动调用。
以下情况都会调用拷贝构造函数:
1.一个对象以值传递的方式传入函数体或从函数返回
2.一个对象需要通过另外一个对象进行初始化
特征:
1、它是构造函数的重载。
2、它的参数必须使用同类型对象的引用传递。因为对象以值传递的方式进入函数体就会调用拷贝构造函数,这样就会形成无限递归。
3、如果没有显式定义,系统会自动合成一个默认的拷贝构造函数。默认的拷贝构造函数会依次拷贝类的数据成员完成初始化。
4.赋值运算符的重载函数
https://blog.csdn.net/if9600/article/details/64472313
重载操作符是具有特殊函数名的函数,关键字operator后面接需要定义的操作符符号。操作符重载也是一个函数,具有返回值和形参表。它的形参数目与操作符的操作数目相同,函数调用操作符可以接受任意数目的操作数。使用运算符重载可以提高代码的可读性。
返回类型 operate 操作符 (参数列表)
不可以被重载的操作符有:
成员选择符(.) 成员对象选择符(.*)
域解析操作符(::) 条件操作符(?:)
(除了赋值号=之外,基类中被重载的操作符都将被派生类继承)
1、不能通过连接其他符号来创建新的操作符:比如operator@;void operator @(){}
2、重载操作符必须有一个类 类型或者枚举类型的操作数
3、用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不能改变其含义
4、不再具备短求值 特性重载操作符不能保证操作符的求值顺序,在重载&&和||中,对每个操作数都要进行求值,而且对操作数的求职顺序不能做规定,因此:重载&&、||和逗号操作符不是好的做法--重载后不能改变运算符的操作对象的个数以及其原有的优先级
5、作为类成员的重载函数,其形参看起来比操作数数目少1是因为成员函数的操作符有一个默认的形参this,限定为第一个形参。
6、???一般将算术操作符定义为非成员函数,将赋值运算符定义成员函数
7、操作符定义为非类的成员函数时,一般将其定义为类的友元
8、== 和 != 操作符一般要成对重载
9、下标操作符[]要重载两次:一个非const成员并返回引用,一个是const成员并返回引用
10、解引用操作符*和->操作符,不显示任何参数
11、自增自减操作符前置式++/--必须返回被增量或者减量的引用后缀式操作符必须返回旧值,并且应该是值返回而不是引用返回
12、输入操作符>>和输出操作符<<必须定义为类的友元函数(重载为类的成员函数不合理,调用时会与逻辑相反:a<<out;)
5.取地址操作符的重载函数
6.const修饰的取地址操作符的重载函数
关于const修饰类成员:
1、const修饰形参,一般和引用同时使用
2、const修饰返回值
3、const修饰类数据成员,必须在构造函数的初始化列表中初始化
4、const修饰类成员函数,实际修饰隐含的this,表示在类中不可以对类的任何成员进行修改
5、在const修饰的成员函数中要对类的某个数据成员进行修改,该数据成员定义声明是必须加mutable关键字
const对象不可以调用非const成员函数。
非const对象可以调用非const成员函数和const成员函数 。
const成员函数内可以调用其它的const成员函数。
非const成员函数内可以调用其它的const成员函数非const成员函数。
void FunTest()与void FunTest()const在类中构成函数重载,因为const修饰的是this指针,因此这两个函数的参数列表不同。
6.this指针
一、this指针的特性:
1、this指针的类型 : 类类型* const
2、this指针并不是对象本身的一部分,不影响sizeof的结果。
3、this的作用域在类成员函数的内部。
4、this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递,类编写者不能显式传递。
5、只有在类的非静态成员函数中才可以使用this指针,其它任何函数都不可以。
6、如果参数个数确定,this指针通过寄存器ecx传递给被调用者,如果参数个数不确定,this指针在所有参数被压栈后压入堆栈
用法:
一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。