我正在阅读http://www.gotw.ca/gotw/036.htm(它是关于直接初始化和复制初始化),它提到了:
static_cast<S>(t); // performing a static_cast
static_cast使用直接初始化。
有人可以解释static_cast
为什么以及如何使用初始化?我认为转换只是重新解释给定内存位置中的位...
答案 0 :(得分:4)
reinterpret_cast重新解释这些位。 static_cast是一种语义感知转换。它会尝试找到一个合理的操作,将一个值从一种类型转换为另一种类型,如果不能,则无法编译。
敏感操作是在各种整数和浮点类型之间进行转换(可能是截断),自动转换为bool,将bool转换为数字等。还使用用户定义的转换运算符和单参数构造函数来转换和到用户定义的类型。并且在它使用构造函数的情况下,它使用直接初始化,因此可以使用显式构造函数,而不像隐式转换,不能。
答案 1 :(得分:0)
static_cast正在类层次结构中执行查找以转换为正确的类,它不会重新解释这些位(即reinterpret_cast)。
dynamic_cast也是如此,区别在于static_cast是在编译时完成的,而dynamic_cast是在运行时完成的。
采用以下示例: A:B,A:C,D:B,C
以下代码将打印指针指向不同的内存块
{
D *ptrToD = new D();
C *ptr1 = static_cast<C>(ptrToD);
C *ptr2 = reinterpret_cast<C>(ptrToD);
if (ptr1==ptr2)
{
printf("Pointers point to the same memory block");
} else
{
printf("Pointers point to different memory blocks");
}
}
如果你看一下内存,它会看起来像 ABACD
如果你想把它投射到C,C从D开始+ sizeof(B)(AC)开始,而A和B从与D相同的存储块开始。
答案 2 :(得分:0)
也许这不是一个完全解释性的例子,但请注意以下内容
void f(double **arg) {} // just to make a point
int main() {
double d(1.);
double *pd = &d;
double const *cpd = &d;
f(&pd); // OK
f(&(const_cast<double*>(cpd))); // Error
}
安排的错误是
错误C2102:&amp;需要l值
static_cast的行为方式相同,因为它们返回一个必须绑定到变量的r值。这是变量初始化
答案 3 :(得分:0)
我认为转换只是重新解释给定内存位置中的位...
不,强制执行类型转换。在这种情况下,它会将t
转换为S
类型;由于T
继承自S
,因此可以进行此类转换,因此可以通过复制S
的该部分来制作新的t
。像这样复制基础子对象有时称为切片。
有人可以解释
static_cast
为什么以及如何使用初始化?
类型转换需要创建新类型的(临时)对象;该对象需要初始化,static_cast
的规则指定它使用直接初始化。由于S
是一个类类型,这意味着它是通过调用一个合适的构造函数来初始化的 - 在本例中是隐式声明的复制构造函数,它通过复制S
t
子对象来初始化对象。 1}}。