六个默认函数
- 构造函数
- 拷贝构造函数
- 析构函数
- 赋值运算符重载
- 取址(&)运算符重载
- const修饰的取址运算符重载
默认的意思 是如果我们在构造一个类时如果没有自定义某些方法,那么编译器就会自动调用它默认的方法。
1. 构造函数
作用:用来初始化对象的成员变量。
特点:
- 函数名与类名相同
- 没有返回值
- 没有this指针
- 新对象被创建时,由编译器自动调用,且在对象的生命周期内仅调用 一次
- 构造函数可以重载,实参决定了调用哪个构造函数
- 无参构造函数和全缺省的构造函数都认为是缺省的构造函数,
并且缺省的构造函数只能一个 - 如果没有显式定义时,在必要情况下,编译器会合成一个默认的构造函数
初始化列表
用于对对象成员进行初始化,格式为在函数名和函数体之间,以一个冒号开始,后面跟着以逗号隔开的数据成员列表,在每个成员后接一个圆括号,括号中为初始化的内容。
例如:
class Time
{
public:
//构造函数
Time(int hour = 0, int minute = 0, int second = 0)
:_hour(hour)
,_minute(minute)
,_second(second)
{
}
private:
int _hour;
int _minute;
int _second;
};
注意事项:
- 每个成员函数只能初始化一次。
- 初始化列表只能用于初始化类的数据成员,并且数据成员在类中的定义顺序就是对数据成员的初始化顺序。当编译器扫描到并初始化完毕最后定义的数据成员后,初始化结束。
- 引用成员变量、const成员变量、类类型成员(该类有非缺省的构造函数) 这三种成员,必须用初始化列表进行初始化。
2. 拷贝构造函数
函数名也为类名,只有一个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为拷贝构造函数。拷贝构造函数是特殊的构造函数,创建对象时使用已存在的同类对象来进行初始化,由编译器自动调用。
特性:
-
对于构造函数的重载、构造函数的性质,拷贝构造函数均满足 。
-
参数必须使用类类型对象引用传递 ,如果是传值,则会引发无穷调用
-
如果没有显式定义,必要情况下,系统会自动合成一个默认的拷贝构造函数。默认的拷贝构造函数会依次拷贝类的数据成员完成初始化。若无必要,则编译器会通过复制的方式来完成对对象的拷贝功能
class Time { public: //构造函数 Time(int hour = 0, int minute = 0, int second = 0) :_hour(hour) ,_minute(minute) ,_second(second) { doSomeThing... } //拷贝构造函数 Time(const Time& t) :_hour(t._hour) ,_minute(t._minute) ,_second(t._second) { } private: int _hour; int _minute; int _second; };
实现场景
1. 使用已经存在的对象创建新的对象
Time t1(12,01,59);
Time t2(t1);
2. 传值方式作为函数的参数
void FunTest1(const Time t)
{
}
3. 传值方式作为函数返回值
Time FunTest2()
{
Time t;
return t;
}
3.析构函数
与构造函数的功能相反,用于销毁对象,由编译器自动调用。
特点:
- 析构函数在类名(即构造函数名)加上字符~ (~time();)
- 析构函数无参数无返回值
- 一个类有且只有一个析构函数。若未显示定义,系统会自动生成缺省的析构函数
- 对象生命周期结束时,C++编译系统自动调用析构函数
- 注意析构函数体内并不是删除对象,而是做一些清理工作
4.赋值运算符重载
c++为了增强代码的可读性引入了运算符重载
特性:
函数名字为:关键字operator后面接需要重载的运算符号
函数原型为:返回值类型operator操作符(参数列表)
注意:
- 不能通过连接其他操作符来创建新的操作符:比如operator@
- 重载操作符必须有一个类类型或者枚举类型的操作数
- 用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不能改变其含义
- 作为类成员的重载函数时,骑行餐看起来不操作数数目少1成员函数的操作符有一个默认的形参this,限定为第一个形参。
- *、::、sizeof、?、这五个运算符不能重载。
Date& operator=(const Date& d)
{
if (this != &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
5. 取地址操作符重载
也是操作符重载的一种
A* operator &();
6.const取地址运算符重载
const A* operator &() const;
当&重载为被const修饰的成员函数时,系统会默认地对返回值加上const修饰。
若对调用此重载时,若不显式调用自己定义的取地址重载,则系统会调用它自己默认的函数。