类声明: class Sales_data;
class Sales_data; //类声明, 类似函数声明 class Sales_data item1; //定义对象 class可省略 Sales_data item2;
不完全类: 一个类被声明后, 在未定义之前的状态。
不完全类的应用:
1、可以定义指向不完全类型的 指针或引用,
2、也可以声明(不是定义)以不完全类型作为参数类型或返回类型的函数。 即: 声明(非定义)一个函数时,可以参数类型和返回类型 可以是不完全类型。
注意:在创建类对象或使用引用、指针所指向类的成员(r.member pointer.member)前,必须先定义类。所以,只有当完成类的定义后, 该类的数据成员才能被声明成这种类类型(即在定义该类时,数据成员的类型不能声明成该类型本身)。 但是如果之前已经声明过(未定义)该类(还是个 不完全类),那么在定义该类时,数据成员或 声明(非定义)成员函数时的返回类型和 参数类型,只能声明为该类型的指针或引用。
1 class Link_screen { 2 Screen window; 3 Link_screen *next; 4 Link_screen *prev; 5 };
友元类:类还可以把其他类或其他类的成员函数定义成friend, 友元函数能定义在类内部, 是隐式inline的。
如果一个类指定了友元类, 那么这个友元类的成员函数 可以访问 这个类的所成员 (包括私有成员),友元不存在传递性
1 class Screen { 2 friend class Window_mgr; //类Window_mgr是 Screen类的 友元类 3 4 // Screen的其他成员。 5 }; 6 7 8 class Window_mgr { 9 public: 10 using ScreenIndex = std::vector<Screen>::size_type; // 每个窗口都有编号。下标类型 11 void clear(ScreenIndex); // 按照编号指定的Screen重置空白。 12 private: 13 std::vector<Screen>screens{ Screen(24.80, '') }; 14 }; 15 16 void Window_mgr::clear(ScreenIndex i) //函数clear可以访问Screen类的私有成员 17 { 18 // 首先把s定义成screens vector中第i个位置上的Screen的引用, 随后利用Screen的height 和width计算出 一个新的string对象, 并令其含有若干个空白符, 最后把含空白的字符串赋给contents 成员。 19 Screen &s = screens[i]; 20 s.contents = string(s.hetght*s.width, ' '); // 将选定的Screen 重置为空白。 21 }
令成员函数作为友元: 可以只把 某个成员函数 指定为友元。 友元什么时 应该指明 成员函数属于哪个类。
class Screen { friend Window_mgr::clear (Screenindex i); //友元函数可以定义在类内 ... }