我听说static_cast函数应该优于c风格或简单函数风格的强制转换。这是真的吗?为什么?


当前回答

问题不仅仅是使用static_cast<>还是c风格强制转换,因为使用c风格强制转换时会发生不同的事情。c++强制转换操作符的目的是使这些不同的操作更加显式。

从表面上看,static_cast<>和c风格的强制类型转换似乎是一回事,例如,当将一个值强制转换为另一个值时:

int i;
double d = (double)i;                  //C-style cast
double d2 = static_cast<double>( i );  //C++ cast

这两个函数都将整数值转换为double类型。然而,当使用指针时,事情变得更加复杂。一些例子:

class A {};
class B : public A {};

A* a = new B;
B* b = (B*)a;                                  //(1) what is this supposed to do?

char* c = (char*)new int( 5 );                 //(2) that weird?
char* c1 = static_cast<char*>( new int( 5 ) ); //(3) compile time error

在这个例子中(1)可能没问题,因为A指向的对象实际上是b的一个实例,但如果你不知道在代码中A实际上指向什么呢?

(2)可能是完全合法的(您只想查看整数的一个字节),但它也可能是一个错误,在这种情况下,一个错误将是很好的,如(3)。

c++强制转换操作符旨在通过在可能的情况下提供编译时或运行时错误来暴露代码中的这些问题。

因此,对于严格的“值强制转换”,可以使用static_cast<>。如果你想运行时对指针进行多态转换,请使用dynamic_cast<>。如果真的想忘记类型,可以使用reintrepret_cast<>。而要将const抛出窗外,有const_cast<>。

它们只是让代码更明确,这样看起来你知道你在做什么。

其他回答

Static_cast意味着您不能意外地使用const_cast或reinterpret_cast,这是一件好事。

一个实用的提示:如果您计划整理项目,可以在源代码中轻松搜索static_cast关键字。

Static_cast除了操作指向类的指针外,还可以用于执行类中显式定义的转换,以及执行基本类型之间的标准转换:

double d = 3.14159265;
int    i = static_cast<int>(d);

Allows casts to be found easily in your code using grep or similar tools. Makes it explicit what kind of cast you are doing, and engaging the compiler's help in enforcing it. If you only want to cast away const-ness, then you can use const_cast, which will not allow you to do other types of conversions. Casts are inherently ugly -- you as a programmer are overruling how the compiler would ordinarily treat your code. You are saying to the compiler, "I know better than you." That being the case, it makes sense that performing a cast should be a moderately painful thing to do, and that they should stick out in your code, since they are a likely source of problems.

参见有效c++介绍

问题不仅仅是使用static_cast<>还是c风格强制转换,因为使用c风格强制转换时会发生不同的事情。c++强制转换操作符的目的是使这些不同的操作更加显式。

从表面上看,static_cast<>和c风格的强制类型转换似乎是一回事,例如,当将一个值强制转换为另一个值时:

int i;
double d = (double)i;                  //C-style cast
double d2 = static_cast<double>( i );  //C++ cast

这两个函数都将整数值转换为double类型。然而,当使用指针时,事情变得更加复杂。一些例子:

class A {};
class B : public A {};

A* a = new B;
B* b = (B*)a;                                  //(1) what is this supposed to do?

char* c = (char*)new int( 5 );                 //(2) that weird?
char* c1 = static_cast<char*>( new int( 5 ) ); //(3) compile time error

在这个例子中(1)可能没问题,因为A指向的对象实际上是b的一个实例,但如果你不知道在代码中A实际上指向什么呢?

(2)可能是完全合法的(您只想查看整数的一个字节),但它也可能是一个错误,在这种情况下,一个错误将是很好的,如(3)。

c++强制转换操作符旨在通过在可能的情况下提供编译时或运行时错误来暴露代码中的这些问题。

因此,对于严格的“值强制转换”,可以使用static_cast<>。如果你想运行时对指针进行多态转换,请使用dynamic_cast<>。如果真的想忘记类型,可以使用reintrepret_cast<>。而要将const抛出窗外,有const_cast<>。

它们只是让代码更明确,这样看起来你知道你在做什么。