一、再谈构造函数
1.1、初始化列表
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
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) 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量, 一定会先使用初始化列表初始化。初始化列表相当于在定义数据时给数据初始化。
4)成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关
1.2、explicit关键字
构造函数不仅可以构造与初始化对象,还具有类型转换的作用,而explicit关键字就是禁止隐式类型转化的。
二、static数据成员
static修饰的变量称为静态成员变量,static修饰的函数称为静态成员函数。他们都是类的成员,也受public、protect、private的限制
静态成员变量必须在类外定义,因为它处于静态区,属于全部类对象成员,初始化列表不会初始化它。
静态成员函数,它没有this指针,不能访问类中的成员。
三、友元
友元分为友元函数和友元类。
3.1、友元函数
在上一篇中的流插入,流提取中用到了友元函数,那么它究竟有什么性质呢?
1)友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。
2)友元函数不能用const修饰
3)友元函数不受访问限定符的限制
4)一个函数可以是多个类的友元函数
3.2、友元类
1)友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
2)友元关系是单向的,不具有交互性。
3)友元关系不能传递 如果C是B的友元, B是A的友元,则不能说明C时A的友元。
4)友元关系不能继承。
四、内部类
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类就是外部类的友元类
性质:
1. 内部类可以定义在外部类的public、protected、private都是可以的。
2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
3. sizeof(外部类)=外部类,和内部类没有任何关系。