共读Primer64.[7.3]类类型 Page249
Posted chattyku
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了共读Primer64.[7.3]类类型 Page249相关的知识,希望对你有一定的参考价值。
类类型
对于类来说每个类的定义都是唯一的类型,即使两个类的成员完全一样,他们仍然是不同的类型
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; };
友元的声明不具有传递的特性
也就是说每个类都只单独维护它自己的友元类或函数。
以上是关于共读Primer64.[7.3]类类型 Page249的主要内容,如果未能解决你的问题,请参考以下文章
共读Primer49.[6.3]返回类型和return语句--关于返回值 Page201
共读Primer51.[6.3]返回类型和return语句--列表初始化返回值 Page203