C++默认的6个成员函数
何为默认?若programmer不定义或调用,则编译器会自动定义或调用它默认的方法。
1. 构造函数
用来初始化对象的成员变量。
特点:
1. 函数名与类名相同
2. 没有返回值
3. 新对象被创建时,由编译器自动调用,且在对象的生命周期内仅调用
一次
4. 构造函数可以重载,实参决定了调用哪个构造函数
5. 无参构造函数和全缺省的构造函数都认为是缺省的构造函数,并且缺省的构造函数只能有一个
6. 有初始化列表(可以不用)
7. 如果没有显式定义时,在必要情况下,编译器会合成一个默认的构造函数
8. 对于单个参数构造函数,可以将其接受参数转化成类类型对象。用explicit修饰构造函数,抑制由构造函数定义的隐式转换,explicit关键字类内部的构建声明上,在类的定义体外部的定义上不再重复
例如:
Class DATA{
public:
explict DATA(int year)
{
_year = year;
}
privite:
int year;
int month;
int day;
};
“在必要情况下编译器会合成一个默认的构造函数”,的情况为一下几种:
1. 当含有类类型的对象成员,且该类类型对象有缺省的构造函数(无参数或全缺省)
2. 待定
3. 待定
4. 待定
初始化列表
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个”成员变量”后面跟一个放在括号中的初始值或表达式
class Student{
public:
Student(int a = 1, int b = 2)
:a(a)
,b(b)
{
this->a = a;
this->b = b;
}
Student(int a)
{
this->a = a;
this->b = 3;
}
int add()
{
return this->a + this->b;
}
int add(int a, int b)
{
return a + b;
}
private:
int a;
int b;
};
注意事项:
1. 每个成员函数只能初始化一次
2. 初始化列表只能用于初始化类的数据成员,并且数据成员在类中的定义顺序就是对数据成员的初始化顺序。当编译器扫描到并初始化完毕最后定义的数据成员后,初始化结束。
3. 引用成员变量、const成员变量、类类型成员(该类有非缺省的构造函数) 这三种成员,必须用初始化列表进行初始化。
2. 拷贝构造函数
函数名也为类名,只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为拷贝构造函数。拷贝构造函数是特殊的构造函数,创建对象时使用已存在的同类对象来进行初始化,由编译器自动调用
特性:
1. 对于构造函数的重载、构造函数的性质,拷贝构造函数均满足
2. 参数必须使用类类型对象引用传递
3. 如果没有显式定义,必要情况下,系统会自动合成一个默认的拷贝构造函数。默认的拷贝构造函数会依次拷贝类的数据成员完成初始化。若无必要,则编译器会通过复制的方式来完成对对象的拷贝功能。
必要的情况:
类中成员含有其他类的对象,且其他类中含有显式的拷贝构造函数
注意事项:
当函数的返回值为类类型的对象时,返回值时会自动调用拷贝构造函数来完成对于函数体中临时对象的拷贝,因此在函数体中的创建临时对象可以传递到函数体外部
3. 析构函数
与构造函数的功能相反,用于销毁对象,由编译器自动调用。
特点:
1. 析构函数在类名(即构造函数名)加上字符~
2. 析构函数无参数无返回值
3. 一个类有且只有一个析构函数。若未显示定义,系统会自动生成缺省的析构函数
4. 对象生命周期结束时,C++编译系统系统自动调用析构函数
5. 注意析构函数体内并不是删除对象,而是做一些清理工作
4. 赋值操作符重载
赋值操作符重载是操作符重载的一种,
5. 取地址操作符重载
赋值操作符重载是操作符重载的一种,
6. const修饰的取地址操作符重载
当&重载为被const修饰的成员函数时,系统会默认地对返回值加上const修饰。
若对调用此重载时,若不显式调用自己定义的取地址重载,则系统会调用它自己默认的函数。