从C到C++【类和对象03】

101 阅读2分钟

一、再见构造函数

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 概念

  1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
  2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
  3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
  4. 静态成员函数没有隐藏的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;