- **构造函数:**构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主
要任务并不是开空间创建对象,而是初始化对象。
- 构造函数的特性:
(1)函数名与类名相同。
(2)无返回值。
(3)对象实例化时编译器自动调用对应的构造函数。
(4)可以重载。 - 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参
构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。 - 编译器生成默认的构造函数会对自定义类型(class,struct,union定义的类型)成员调用的它的默认成员函数。
- 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括
号中的初始值或表达式。
例如:
class Date
{
public:
Date(int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
{}
private:
int _year;
int _month;
int _day;
};
*当类成员变量包含类类型、const类型、引用类型时必须放在初始化列表中进行初始化。
*成员变量的初始化顺序是其在类中的声明顺序,而与其初始化列表中的顺序无关。
*构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用;可以使用explicit关键字声明构造函数
使单参数构造函数不能进行隐式类型转换。如:
class Date
{
public:
//Date(int year)
//:_year(year)
//{}
explicit Date(int year)
:_year(year)
{}
private:
int _year;
int _month:
int _day; };
void TestDate()
{
Date d1(2018);
// 用一个整形变量给日期类型对象赋值
// 实际编译器背后会用2019构造一个无名对象,最后用无名对象给d1对象进行赋值;当用explicit关键字声明时该语句会报没有匹配的=运算符的错误。
d1 = 2019; }
- **析构函数:**析构函数是特殊的成员函数,对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。
- 析构函数的特性:
(1)析构函数名是在类名前加上字符 ~。
(2) 无参数无返回值。
(3) 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
(4) 对象生命周期结束时,C++编译系统系统自动调用析构函数。 - 编译器自动生成的析构函数函数调用其自定义类型成员的析构函数。
- 拷贝构造函数: 只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建
新对象时由编译器自动调用。
- 拷贝构造函数的特性:
(1)拷贝构造函数是构造函数的一个重载形式。
(2)拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。
- 赋值运算符重载:
- 运算符重载的规则:
(1) 函数名字为:关键字operator后面接需要重载的运算符符号。
(2)函数原型:返回值类型 operator操作符 (参数列表)
(3)不能通过连接其他符号来创建新的操作符:比如operator@ 。
(4)重载操作符必须有一个类类型或者枚举类型的操作数。
(5)用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不能改变其含义。
(6)作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的。
(7)操作符有一个默认的形参this,限定为第一个形参。
(8)* :: sizeof ?: .
注意以上5个运算符不能重载。
-
**取地址及const取地址:**这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比
如想让别人获取到指定的内容。 -
补充:类的const成员函数:
- 定义:在成员函数原型后面加const,const修饰this指针所指向的对象(即调用成员函数的当前对象),表示在该函数调用时this指针指
向对象的成员不可改变。
const成员函数可以调用其他const成员函数,而不可调用非const成员函数;
非const成员函数可以调用const成员函数和非const成员函数。