是否有理由更喜欢static_cast<>而不是C风格强制转换?它们相等吗?速度有什么不同吗?


当前回答

简而言之:

static_cast<>()提供了编译时检查功能C-Style 不。 Static_cast <>()可读性更强,也更容易被发现 在c++源代码中的任何地方,C_Style强制转换都是无效的。 使用c++类型转换可以更好地传达意图。

更多的解释:

静态强制转换执行兼容类型之间的转换。它类似于c风格的强制转换,但限制更大。例如,c风格的强制转换将允许整数指针指向char类型。

char c = 10;       // 1 byte
int *p = (int*)&c; // 4 bytes

由于这将导致指向4字节类型的指针,指向已分配内存的1字节,因此写入此指针将导致运行时错误或覆盖一些相邻内存。

*p = 5; // run-time error: stack corruption

与c风格的强制转换相反,静态强制转换将允许编译器检查指针和被指针数据类型是否兼容,这允许程序员在编译期间捕获错误的指针赋值。

int *q = static_cast<int*>(&c); // compile-time error

你也可以查看这个页面了解更多关于c++类型转换的解释:点击这里

其他回答

c++样式转换由编译器检查。C风格强制转换在运行时不会失败,也可能失败。

此外,c++样式转换可以很容易地搜索到,而c样式转换则很难搜索到。

另一个很大的好处是,4种不同的c++风格类型转换更清楚地表达了程序员的意图。

在写c++的时候,我几乎总是使用c++风格,而不是C风格。

一个很好的帖子,解释了C/ c++中不同的类型转换,以及C风格的类型转换到底做了什么:https://anteru.net/blog/2007/12/18/200/index.html

c风格强制转换,使用(type)变量语法。有史以来最糟糕的 发明。它尝试执行以下强制类型转换,顺序如下:(参见 c++标准,5.4 expr。第5段) const_cast static_cast Static_cast后面跟着const_cast reinterpret_cast reinterpret_cast后面跟着const_cast

Static_cast在编译时检查转换是否在明显不兼容的类型之间进行。与dynamic_cast相反,在运行时不检查类型兼容性。而且,static_cast转换并不一定安全。

Static_cast用于从指向基类的指针转换为指向派生类的指针,或在原生类型之间转换,例如enum转换为int型或float转换为int型。

static_cast的用户必须确保转换是安全的。

c风格的强制转换不执行任何检查,无论是在编译时还是在运行时。

由于存在许多不同类型的强制转换,每种类型都具有不同的语义,因此static_cast<>允许您说“我正在进行从一种类型到另一种类型的合法转换”,例如从int型到double型。简单的c风格强制转换可能意味着很多事情。你在上/下选角吗?你是在重新解释指针吗?

简而言之:

static_cast<>()提供了编译时检查功能C-Style 不。 Static_cast <>()可读性更强,也更容易被发现 在c++源代码中的任何地方,C_Style强制转换都是无效的。 使用c++类型转换可以更好地传达意图。

更多的解释:

静态强制转换执行兼容类型之间的转换。它类似于c风格的强制转换,但限制更大。例如,c风格的强制转换将允许整数指针指向char类型。

char c = 10;       // 1 byte
int *p = (int*)&c; // 4 bytes

由于这将导致指向4字节类型的指针,指向已分配内存的1字节,因此写入此指针将导致运行时错误或覆盖一些相邻内存。

*p = 5; // run-time error: stack corruption

与c风格的强制转换相反,静态强制转换将允许编译器检查指针和被指针数据类型是否兼容,这允许程序员在编译期间捕获错误的指针赋值。

int *q = static_cast<int*>(&c); // compile-time error

你也可以查看这个页面了解更多关于c++类型转换的解释:点击这里