目录:点我
一、友元
1. 友元类
类并非只能拥有友元函数,也可以将类作为友元,这种情况下,友元类的所有方法都可以访问原始类的私有成员和保护成员:
友元类可以位于共有、私有或保护部分,由于 Remote 类提到了 Tv 类,所以编译器必须了解 Tv 类后,才能处理 Remote 类,为此,最简单的方法是首先定义 Tv 类。
2. 友元成员函数
对于上一个例子,Remote 类可能直接访问 Tv 类成员的情况很少,假设只有一个函数 set_chan() 访问了 Tv 成员,那么更高效的方式是将 Remote 的成员函数作为 Tv 的友元函数:
然而,要使编译器能够处理这条语句,它必须知道 Remote 的定义。这意味着 Remote 的定义需要放到 Tv 之前,但又因为 Remote 的方法提到了 Tv 对象,因此产生了循环依赖,解决这个问题方法需要前向声明(forward declaration),需要在 Remote 定义的前面插入语句:
第二种情况不可行的原因是编译器在 Tv 类的声明中看到 Remote 的一个方法被声明为 Tv 类的友元之前,应该先看到 Remote 类的声明和 set_chan() 方法的声明。
但是第二种方式还存在一个问题,由于 Remote 声明中包含了内联代码:
由于此处调用 Tv 的一个方法,因此编译器必须已经看到 Tv 类的声明,这样才能知道 Tv 有哪些方法,因此还是应当采用第一种顺序。
3. 其他友元关系
友元类不但可以单向,也可以双向,即让两个类彼此称为友元类,此时由于互相调用的关系,最好使用前向声明对两个类进行声明。
4. 共同的友元
有时函数需要同时访问两个类的私有数据,但它不能同时是两个类的成员函数,此时将一个函数设置为两个类的友元更为合理。
二、嵌套类
三、异常机制
四、RTTI
运行阶段类型识别:RTTI(Runtime Type Identification),是 C++ 的新特性,旨在为程序在运行阶段确定对象的类型提供一种标准方式。
假设有一个类层次结构,其中的类都是从同一个基类派生而来,则可以让基类指针只想其中任何一个类的对象,这样便可以调用这样的函数:在处理一些信息后,选择一个类,并创建这种类型的对象,然后返回它的地址,而该地址可以被赋给基类指针,那么如何知道指针指向的是哪种对象?
1. RTTI 的工作原理
C++ 有 3 个支持 RTTI 的元素:
- dynamic_cast 运算符将使用一个指向基类的指针来生成一个指向派生类的指针,否则返回空指针;
- typeid 运算符返回一个指出对象的类型的值;
- type_info 结构存储了有关特定类型的信息。
只能将 RTTI 用于包含虚函数的类层次结构,原因在于只有对于这种类层次结构,才应该将派生对象的地址赋给基类指针。
Ⅰ. dynamic_cast
dynamic_cast 运算符是最常用的 RTTI 组件,它不能回答“指针指向的是哪类对象”,但能够回答“是否可以安全地将对象的地址赋给特定类型的指针”:
Ⅱ. typeid 运算符和 type_info 类
typeid 运算符能够确定两个对象是否为同种类型,与 sizeof 相似,可以接受两种参数:
- 类名;
- 结果为对象的表达式。
返回一个对 type_info 对象的引用,为 typeinfo 头文件中的一个类,他重载了 == 和 != 运算符,以便可以比较类型:
typeinfo 类包含一个 name() ,该函数返回一个随实现而异的字符串,通常是类的名称:
五、类转换运算符
原创存证 · 本地哈希 · e53bd7a15076...
算法:SHA-256
时间:2026-10-15
哈希:
e53bd7a15076300364b86560b25d2829e19a8163b914917095880bbbe756df8d该信息用于辅助证明当前内容版本,不等同于法律公证或版权登记。
- 作者:BeZer0
- 链接:https://blog.bezer0.cn/%E8%80%83%E7%A0%94/3fa0bc13-b7ac-8048-9595-f0ef12004927
- 声明:本文为原创文章,采用 CC BY-NC-SA 4.0 协议,转载请注明作者和原文链接。

