class Widget {
public:
explicit Widget(int size);
...
};
void doSomeWork(const Widget& w);
doSomeWork(Widget(15)); // create Widget from int
// with function-style cast
doSomeWork(static_cast(15)); // create Widget from int
// with C++-style cast
由于某种原因,有条不紊的对象创建感觉上不像一个强制转型,所以在这个强制转型中我多半会用函数风格的强制转型代替 static_cast。反过来说,在你写出那些导致核心崩溃(core dump)的代码时,你通常都感觉你有恰当的原因,所以你最好忽略你的感觉并始终都使用新风格的强制转型。
很多程序员认为强制转型除了告诉编译器将一种类型看作另一种之外什么都没做,但这是错误的。任何种类的类型转换(无论是通过强制转型的显式的还是编译器添加的隐式的)都会导致运行时的可执行代码。例如,在这个代码片断中,
int x, y;
...
double d = static_cast(x)/y; // divide x by y, but use
// floating point division
int x 到 double 的强制转型理所当然要生成代码,因为在大多数系统架构中,一个 int 的底层表示与 double 的不同。这可能还不怎么令人吃惊,但是下面这个例子可能会让你稍微开一下眼:
class Base { ... };
class Derived: public Base { ... };
Derived d;
Base *pb = &d; // implicitly convert Derived* → Base*
这里我们只是创建了一个指向派生类对象的基类指针,但是有时候,这两个指针的值并不相同。在当前情况下,会在运行时在 Derived* 指针上应用一个偏移量以得到正确的 Base* 指针值。
|
您将承担一切因您的行为、言论而直接或间接导致的民事或刑事法律责任
留言板管理人员有权保留或删除其管辖留言中的任意内容 本站提醒:不要进行人身攻击。谢谢配合。 |