C++关键字学习笔记

C++关键字(C语言中有的关键字,删除了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
asm 		:允许在 C++ 程序中嵌入汇编代码<C语言也可以嵌入>
auto :是存储类型标识符,表明变量"自动"具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。
inline :(内联)函数的定义将在编译时在调用处展开。inline 函数一般由短小的语句组成,可以提高程序效率。
typeid :指出指针或引用指向的对象的实际派生类型。
bool
dynamic_cast
typename
mutable
catch
explicit
namespace
static_cast
using
export
new
virtual
class
operator
false
private
template
volatile
const_cast
protected
this
wchar_t
continue:跳过当前循环
public
throw
friend
register
true
delete
reinterpret_cast
try

C++之继承关系
继承关系可访问的类关系表示如下表格:

继承方式 基类的public成员 基类的protected 基类成员private
public public protected 不可见
protected 变成protected成员 protected 不可见
private 变成private成员 private 不可见

继承方式权限的减小,会将成员权限减小

四种显式强制类型转换方式

静态转换(static_cast)

用途:用于非多态类型间的转换,包括基本数据类型转换、类层次结构中的上行/下行转换(需开发者确保安全)。

特点:

  • 编译时检查类型兼容性,但下行转换(基类→派生类)无运行时检查。
  • 不能去除constvolatile属性。

示例

1
2
3
4
int i = 10;
double d = static_cast<double>(i); // 基本类型转换
Base* b = new Derived();
Derived* dd = static_cast<Derived*>(b); // 下行转换(风险自担)

动态转换(dynamic_cast)

  • 用途‌:专用于多态类型(含虚函数的类)的指针/引用转换,提供运行时类型检查。

特点:

  • 转换失败时返回nullptr(指针)或抛出std::bad_cast(引用)。
  • 仅支持继承关系的类型转换。
    示例
1
2
3
Base* b = new Derived();
Derived* d = dynamic_cast<Derived*>(b); // 成功
if (d == nullptr) { /* 处理失败 */ }

常量转换(const_cast)

  • 用途‌:移除或添加const/volatile属性,不修改底层数据。
  • 限制‌:仅适用于指针或引用,且类型必须相同(除const外)。
  • 示例‌:
1
2
const int* pc = &i;
int* p = const_cast<int*>(pc); // 去const

重新解释转换(reinterpret_cast)

  • 用途‌:低级别指针类型间的强制转换(如int*char*),不进行类型检查。
  • 风险‌:易引发未定义行为,需谨慎使用。
  • 示例‌:
1
2
int* ip = new int(42);
char* cp = reinterpret_cast<char*>(ip); // 重新解释内存

对比总结

转换类型 检查时机 适用场景 安全性
static_cast 编译时 类型兼容的显式转换 中等(需开发者保证)
dynamic_cast 运行时 多态类型的继承转换
const_cast 编译时 修改const/volatile属性 低(可能引发未定义行为)
reinterpret_cast 无检查 无关类型指针的二进制重解释 极低

注:C风格强制转换(type)value混合了上述多种行为,推荐使用C++规范转换以提高可读性和安全性

explicit

作用是防止编译器进行不期望的隐式类型转换

当构造函数只有一个参数,或者虽然有多个参数但除第一个参数外其他参数都有默认值时,如果不使用 explicit 关键字,编译器会自动将该构造函数用于隐式类型转换。这种隐式转换在某些情况下可能导致意外的行为和难以发现的错误