跳转到内容

static_cast

维基百科,自由的百科全书

static_castC++编程语言中的一个标识符,是用于模式转换运算符[1]


语法

static_cast<type> (object);

其中,type是类型标识符,object是待转换的变量名称(其类型标识不需要在这里声明)。


需要注意的是static_cast要求编译器必须能够通过已知的方法将object从其原有的类型转换为type类型(不管是通过内置方法 (builtin) 还是转换方法 (cast))。类型可以是引用 (reference) 或者是枚举器 (enumerator)。static_cast的适用范围比较广泛,任何编译器定义明确的、允许转换的类型都可以使用它来相互转换。[2]


static_cast可以在如下场景中使用:

  • 把一个指向基类 (base class) 的指针转换为指向非虚派生类 (non-virtual derived class) 的指针;
  • 把数值类型的数据(但不是数值,例如enum)转换为数值(例如intfloat)。


虽然static_cast会在编译时检查 (compiler-time checked) 以防止出现明显的不兼容或错误现象;但是,其不会在运行时检查 (run-time checking) 不明显的不兼容现象(例如指针之间的转换)。举一个例子,我们假定一个static_cast将一个类指针B转换为一个派生类指针D,如果B是派生类D模糊或不可访问的基类,那么static_cast就是错误的。再比如,一个指向虚基类的指针,或者指向虚基类的基类的指针,用static_cast转换为指向派生类的指针就是错误的。


另外,static_cast是可以返回数值的,例如以下代码是合法的[3]

long var = 1000;
std::cout << static_cast<int> (var) << std::endl;

参考资料

  1. ^ Programming: Principles and Practice Using C++. New Jersey, US: Addison-Wesley. 2009: 594. ISBN 978-0321543721. OCLC 988823060. 
  2. ^ Eckel, Bruce. Thinking in C++需要免费注册. New Jersey, US: Prentice Hall. 2000: 857. ISBN 0-13-979809-9. 
  3. ^ Prada, Stephen. C++ Primer Plus. New Jersey, US: Pearson Education, Inc. 2015: 107. ISBN 978-7-115-38111-8.