一、再见构造函数
1.1 初始化列表
:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式
1.2 示例
class Date
{
public:
Date(int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
{}
private:
int _year;
int _month;
int _day;
};
1.3 意义
那么这个初始化列表的意义在哪里呢?可能这个例子没有什么用,但是如果是const对象或者是引用对象呢?const对象和引用对象必须在初始化列表初始化,所以就有了初始化列表 通常在以下情况下使用初始化列表
引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时)
成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关(非常重要)
二、static成员
2.1 概念
- 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
- 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
- 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
- 静态成员函数没有隐藏的this指针,不能访问任何非静态成员 5.静态成员也是类的成员,受public、protected、private 访问限定符的限制
2.2 示例
class A
{
private:
static int _scount;
};
int A::_scount = 0;
三、友元
3.1 概念
之前我们在重载<<的时候必须在类外去重载,但是我们的成员都是私有的,此时就需要用友元函数 此外友元分为友元函数和友元类
3.2 注意
友元函数:
1.友元函数可访问类的私有和保护成员,但不是类的成员函数 2.友元函数不能用const修饰 3.友元函数可以在类定义的任何地方声明,不受类访问限定符限制 4.一个函数可以是多个类的友元函数 5.友元函数的调用与普通函数的调用原理相同
友元类:
1.友元关系是单向的,不具有交换性。 2.比如之前的Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。 3.友元关系不能传递 4.如果C是B的友元, B是A的友元,则不能说明C时A的友元。 5.友元关系不能继承
四、内部类
4.1 概念
如果一个类定义在另一个类的内部,这个内部类就叫做内部类
4.2 示例
class A {
private:
static int k;
int h;
public:
class B // B天生就是A的友元
{
public:
void foo(const A& a)
{
cout << k << endl;
cout << a.h << endl;
}
};
};
int A::k=1;