繁体   English   中英

static_cast 有什么区别<type>和静态类型<type *> ?</type></type>

[英]What's the difference between static_cast<type> and static_type<type *>?

到目前为止,我知道static_cast是一个编译时操作,它以某种方式分析实体的 memory 并尝试将其转换为指定的 object。

我看到 static_cast 广泛用作static_cast<T *> 这是什么原因? 是不是因为编译器需要一个指针来检查 object 的 memory 布局?

例子:

union U { int a; double b; } u;
void* x = &u;                        // x's value is "pointer to u"
double* y = static_cast<double*>(x); // y's value is "pointer to u.b"
char* z = static_cast<char*>(x);     // z's value is "pointer to u"

但是,对于static_cast<T>这会失败:

double yy = static_cast<double>(u); error: cannot convert 'union U' to 'double' without a conversion operator

我首先在类的使用中发现了这种类型的转换,并且看起来它在那里使用得更多。

Derived * d = new Derived();
Base * b = static_cast<Base *>(d);

然而,同样的问题仍然存在:

Base b1 = Base();
Derived d2 = Derived();

b1 = static_cast<Base>(d2);
// No error here

我能否详细说明 static_cast 如何在幕后工作以及它与 memory (因此是对象)和(如果有必要)发生的指令有何关系?

考虑static_cast的两种不同用例可能会有所帮助:一种用于将非指针类型相互转换,另一种用于将指针类型相互转换。

在将非指针类型相互转换时, static_cast的含义是“进行从源值初始化目标类型的 object 时会进行的那种转换”。 因此,例如,在此代码中:

int aASCII = 64;
cout << static_cast<char>(aASCII) << endl; // Prints 'A'

static_cast<char>(aASCII)的意思是“如果我要将新的char值初始化为aASCII ,请给我我会得到的char值。” 这类似于执行以下操作:

int aASCII = 64;
char temp = aASCII;
cout << temp << endl;

同样,考虑以下代码:

int total = 137;
int numItems = 42;
cout << static_cast<double>(total) / numItems << endl;

static_cast<double>(total)位的意思是“在进行除法时假设totaldouble精度数”。 这类似于写作

int total = 137;
int numItems = 42;
double temp = total;
cout << temp / numItems << endl;

考虑到这一点,为什么这段代码不能编译?

double yy = static_cast<double>(u); // Oops!

原因是这有点像写作

double temp = u; // Oops, doesn't compile
double yy = temp;

在这里,这不会编译,因为您无法将double初始化为union类型U的变量。

使用带有指针的static_cast使用一组不同的规则。 使用指针时, static_cast的意思是“请假装指针指向我希望它指向的类型的 object,但前提是存在一些可行的宇宙。” 因此,例如,这是完全合法的:

Base* ptr = new Derived;
Derived* dPtr = static_cast<Derived*>(ptr);

在这里,这表示“我有一个Base*类型的指针。有一个合理的世界,它确实指向Derived 。请将指针转换为Derived* ,但不要进行任何运行时检查以确保这是安全。我知道,如果这实际上并不指向Derived ,那么会发生坏事。

但是,您不能这样写:

float* ptr = new float[137];
Derived* dPtr = static_cast<Derived*>(ptr); // Error!

这是行不通的,因为float*类型的指针无法指向Derived object(在某个时间点不对某个指针做一些非常可怕的事情)。

你的代码的原因

double* y = static_cast<double*>(x); // y's value is "pointer to u.b"

很好是因为x是一个void* ,它可以指向任何(非功能)实体,所以它可以指向一个double是合理的。

static_cast<type>static_type<type *>有什么区别?

typetype*是不同的类型。 第一次转换转换为一种类型,第二次转换转换为另一种类型。

我看到 static_cast 广泛用作static_cast<T *> 这是什么原因?

因为可能在这些情况下,意图是转换为T*类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM