本文主要是对类的6个默认函数进行讲解
类的默认成员函数有6个:构造函数
析构函数
拷贝构造函数
赋值操作符重载
取地址操作符重载
const修饰的取地址操作符重载
构造函数:
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象是有编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期调用一次。
特性:函数名与类名相同。
无返回值
对象构造(对象实例化)时编译器自动化调用对应的构造函数。
构造函数可以重载。
当自定义构造函数时,编译器就不会生成默认的无参构造函数。
无参的构造函数和全缺省的构造函数都称为缺省构造函数,并且它和无参函数中只能有一个。
用处:当你想初始化成员时,可以用自定义的构造函数,但是这里初始化这个词并不适合,应该叫他赋值(初始化只有一次,而赋值可以有很多次)。
如何初始化:利用初始化列表,以一个冒号开始,接着以一个逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式。例如:
class Date
{
public:
Date(int year,int month,int day)
:_year(year)
,_month(month)
,_day(day)
{}
private:
int _year;
int _month;
int _day;
};
重点:初始化只能初始化一次
成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关
尽量避免使用成员初始化成员
类中包含以下成员,一定要放在初始化列表位置进行初始化:
1. 引用成员变量
2.const成员变量
3.类类型成员(该类有非缺省的构造函数)
析构函数:
与构造函数功能相反,在对象被销毁时,由编译器自动调用,完成类的一些资源清理和汕尾工作
特性:1.析构函数名实在类名前加上一个字符~
2.无参数无返回值
3. 一个类有且只用一个析构函数,若未显示定义,系统会自动生成默认的析构函数
4.对象生命周期结束时,C++编译器系统会自动调用析构函数
例如:
class Seqlist
{
pubilc:
Seqlist(int capacity = 10)
{
_pata = (int *)malloc(capacity*sizeof(int));
_size = 0;
}
~Seqlist()
{
if(_pData)
{
free(_pData);
_pData = NULL;
_size = 0;
}
}
private:
int * _pData;
int _size;
}
注意:析构函数踢被不是删除对象,而是做一些对象删除前的相关工作
拷贝构造函数:
只有单个形参,该形参是对本类类型对象的引用(一般用const修饰)在用已存在的类类型对象,创建新对象时由编译器自动完成
特性:拷贝函数是构造函数的一个重载形式
拷贝函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷的递归调用
赋值操作运算符重载:
存在的原因:当我们要给对象加减一个数时,需要自己写个ADD函数实现的功能,但是这种方式太麻烦了,C++引入了运算符重载,它具有返回值类型,函数名字以及参数,其返回值与参数列表与普通的函数类似,函数名字:关键字operator后面接需要重载的运算符符号,
特性:不能通过连接其他符号来创建新的操作符:比如operator@
重载操作符必须有一个类类型或者枚举类型的操作符
用于内置类型的操作符,其含义不能改变
作为类成员的重载函数,其形参看起来比操作数目少一成员函数的操作符有一个默认的形参this,限定第一个形参
举例:
Date d;
d = d+10;
其中d+10会调用赋值重载运算符,将d的地址传给this,返回一个Date类,将它赋值给d。
陷阱:运算符不能重载 .* :: sizeof ?: .
const成员/函数
在C++中,const修饰的变量已经成为一个常量,具有宏属性,在编译期间,就会替换
修饰成员函数,实际修饰隐含的this,不能对类的成员函数进行修改
取地址及const取地址操作符重载
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,如果不想让别人取到指定的内容