第7章 类

类声明:   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 }
View Code

令成员函数作为友元:  可以只把 某个成员函数 指定为友元。   友元什么时 应该指明 成员函数属于哪个类。

class Screen
{
    friend Window_mgr::clear (Screenindex i);    //友元函数可以定义在类内
    
    ...
}
原文地址:https://www.cnblogs.com/qzhj-pipeofnaturalrule/p/11246196.html