C++关键字学习笔记
C++关键字(C语言中有的关键字,删除了)
1 | asm :允许在 C++ 程序中嵌入汇编代码<C语言也可以嵌入> |
C++之继承关系
继承关系可访问的类关系表示如下表格:
| 继承方式 | 基类的public成员 | 基类的protected | 基类成员private |
|---|---|---|---|
| public | public | protected | 不可见 |
| protected | 变成protected成员 | protected | 不可见 |
| private | 变成private成员 | private | 不可见 |
继承方式权限的减小,会将成员权限减小
四种显式强制类型转换方式
静态转换(static_cast)
用途:用于非多态类型间的转换,包括基本数据类型转换、类层次结构中的上行/下行转换(需开发者确保安全)。
特点:
- 编译时检查类型兼容性,但下行转换(基类→派生类)无运行时检查。
- 不能去除
const或volatile属性。
示例:
1 | int i = 10; |
动态转换(dynamic_cast)
- 用途:专用于多态类型(含虚函数的类)的指针/引用转换,提供运行时类型检查。
特点:
- 转换失败时返回
nullptr(指针)或抛出std::bad_cast(引用)。 - 仅支持继承关系的类型转换。
示例:
1 | Base* b = new Derived(); |
常量转换(const_cast)
- 用途:移除或添加
const/volatile属性,不修改底层数据。 - 限制:仅适用于指针或引用,且类型必须相同(除
const外)。 - 示例:
1 | const int* pc = &i; |
重新解释转换(reinterpret_cast)
- 用途:低级别指针类型间的强制转换(如
int*→char*),不进行类型检查。 - 风险:易引发未定义行为,需谨慎使用。
- 示例:
1 | int* ip = new int(42); |
对比总结
| 转换类型 | 检查时机 | 适用场景 | 安全性 |
|---|---|---|---|
static_cast |
编译时 | 类型兼容的显式转换 | 中等(需开发者保证) |
dynamic_cast |
运行时 | 多态类型的继承转换 | 高 |
const_cast |
编译时 | 修改const/volatile属性 |
低(可能引发未定义行为) |
reinterpret_cast |
无检查 | 无关类型指针的二进制重解释 | 极低 |
注:C风格强制转换(type)value混合了上述多种行为,推荐使用C++规范转换以提高可读性和安全性
explicit
作用是防止编译器进行不期望的隐式类型转换
当构造函数只有一个参数,或者虽然有多个参数但除第一个参数外其他参数都有默认值时,如果不使用 explicit 关键字,编译器会自动将该构造函数用于隐式类型转换。这种隐式转换在某些情况下可能导致意外的行为和难以发现的错误