1
1473
静态铸造
在这个例子中,您知道您通过了
动态铸件
不能使用
“向上强制转换”(强制转换为基类)始终对两者都有效
规则铸件
这些铸件也称为C型铸件。C样式的CAST与尝试C++系列的一系列序列基本相同,并且采用第一个C++模型,不需要考虑。
此外,C样式的强制转换不仅允许您这样做,而且还允许您安全地强制转换到私有基类,而“等效的”
有些人喜欢C型的石膏,因为它们很短。我只使用它们进行数值转换,当涉及到用户定义的类型时,使用适当的C++版本,因为它们提供了更严格的检查。 |
2
138
静态浇铸静态强制转换执行兼容类型之间的转换。它类似于C样式的强制转换,但更具限制性。例如,C样式的转换将允许一个整数指针指向一个字符。
由于这会导致一个4字节的指针指向已分配内存的1字节,因此写入该指针将导致运行时错误或覆盖某些相邻内存。
与C样式转换不同,静态转换将允许编译器检查指针和指针数据类型是否兼容,这允许程序员在编译期间捕获这种不正确的指针分配。
重新解释铸造为了强制进行指针转换,与C样式转换在后台的方式相同,将使用reinterpret转换。
此强制转换处理某些不相关类型之间的转换,例如从一个指针类型到另一个不兼容的指针类型。它只执行数据的二进制拷贝,而不改变底层的位模式。请注意,这种低级操作的结果是特定于系统的,因此不可移植。如果不能完全避免,应谨慎使用。 动态铸件此类型仅用于将对象指针和对象引用转换为继承层次结构中的其他指针或引用类型。通过执行运行时检查指针是否引用目标类型的完整对象,它是唯一确保可以转换指向的对象的强制转换。为了使这个运行时检查成为可能,对象必须是多态的。也就是说,类必须定义或继承至少一个虚拟函数。这是因为编译器将只为这些对象生成所需的运行时类型信息。 动态铸造示例 在下面的示例中,使用动态强制转换将mychild指针转换为mybase指针。派生到基的转换成功,因为子对象包含完整的基对象。
下一个示例尝试将MyBase指针转换为MyChild指针。由于基对象不包含完整的子对象,因此指针转换将失败。为了表明这一点,动态强制转换将返回一个空指针。这为在运行时检查转换是否成功提供了一种方便的方法。
如果转换引用而不是指针,则动态强制转换将通过引发错误的强制转换异常而失败。这需要使用try catch语句来处理。
动态或静态铸造使用动态强制转换的好处在于,它允许程序员在运行时检查转换是否成功。缺点是,执行此检查会带来性能开销。因此,在第一个示例中,使用静态强制转换更可取,因为派生到基的转换永远不会失败。
但是,在第二个示例中,转换可能成功或失败。如果MyBase对象包含MyBase实例,它将失败;如果它包含MyChild实例,它将成功。在某些情况下,直到运行时才知道这一点。在这种情况下,动态强制转换比静态强制转换更好。
如果使用静态强制转换而不是动态强制转换来执行基到派生的转换,则转换不会失败。它会返回一个指向不完整对象的指针。取消对此类指针的引用可能会导致运行时错误。
连续铸造这一个主要用于添加或删除变量的const修饰符。
尽管const cast允许更改常量的值,但这样做仍然是可能导致运行时错误的无效代码。例如,如果常量位于只读内存的一部分,则可能发生这种情况。
const cast主要在函数接受非常量指针参数时使用,即使它不修改指针。
然后,可以使用const cast向函数传递常量变量。
|
3
75
你应该看看这篇文章 C++ Programming/Type Casting . 它包含对所有不同类型的转换的良好描述。以下内容摘自上述链接:
|
4
25
避免使用C型铸造。 C风格的强制转换是const和reinterpret强制转换的混合,在代码中很难找到和替换。C++应用程序程序员应该避免C风格的CAST。 |
5
25
仅供参考,我相信bjarne stroustrup是引用说,C风格的强制转换是要避免的,如果可能的话,你应该使用静态强制转换或动态强制转换。 Barne Stroustrup's C++ style FAQ 就你所要的接受这个建议。我远非C++大师。 |
6
11
C样式的强制转换将const-cast、static-cast和reinterpret-cast合并在一起。 我希望C++没有C样式的转换。C++正确地(如它们应该)显示出突出;Casts通常表示做坏事)并且正确地区分不同类型的转换。它们还允许编写类似的外观函数,例如boost::lexical_cast,从一致性的角度来看,这非常好。 |
7
10
|
8
9
其他答案中包含了C型(和其他)铸件。 |
Community wiki · safe_ptr实现 1 年前 |
lplplplp · 为什么不能访问函数外的结构指针 2 年前 |
Fabio · 在c中将指针赋给常数指针++ 2 年前 |
Gabe Tucker · 无法在golang中分配接口对象指针 2 年前 |