标签:操作 赋值 需要 ring end vat 函数声明 双向 定义
对于类来说每个类的定义都是唯一的类型,即使两个类的成员完全一样,他们仍然是不同的类型
struct First { int memi; int getMem(){return memi;}; }; struct Second { int memi; int getMem(){return memi;}; }; First obj1; Second obj2 = obj1; // 两个不同的类型无法进行赋值操作
同函数一样,类也可以只声明而不定义,这种语法的常用场景是在使用类的地方类暂时不可见,
我们把这种声明叫做前向声明,那么在定义之前它将是一个不完全类型。
class Screen; // 一个典型的双向链表节点定义 class Link_screen { Screen *window; // 不完全类型可以使用指针 Link_screen *next; // 类在内部不能包含自己,但可以包含自己的指针,因为在类定义完成前,它属于不完全类型 Link_screen *prev; };
不完全类型可以定义指针或引用,也可以作为参数或返回值参与函数声明,不可参与定义。
class Screen { friend class Window_mgr; // 声明友元,在Window_mgr类可以使用私有属性 private: pos cursor = 0; pos height = 0, width = 0; std::string contents; }; class Window_mgr { public: using ScreenIndex = std::vector<Screen>::size_type; void clear(ScreenIndex); private: std::vector<Screen> screens{Screen(24, 80, ‘ ‘)}; }; void Window_mgr::clear(ScreenIndex i) { Screen &s = screens[i]; s.contents = string(s.height * s.width, ‘ ‘); } // 在软件设计中有最小授权的原则,所以我们应该将友元的范围仅限定在clear这个成员函数中。 class Screen { // 这里需要注意的一点是,这条声明应该在被声明函数可见的前提下 // 也就是说该声明应该在Window_mgr声明完成后 friend void Window_mgr::clear(ScreenIndex); // 声明友元,使clear函数可以使用私有属性 private: pos cursor = 0; pos height = 0, width = 0; std::string contents; };
友元的声明不具有传递的特性
标签:操作 赋值 需要 ring end vat 函数声明 双向 定义
原文地址:https://www.cnblogs.com/ChattyKu/p/9678805.html