C++ 转换为空指针时是否放弃该值?
代码:C++ 转换为空指针时是否放弃该值?,c++,C++,代码: 类CFoo { INTA; 公众: CFoo():a(1){} ~CFoo(){} getNum(){返回一个;} }; void tfunc(void*数据) { CFoo*foo=静态(数据); 标准::cout 当转换为空指针时,该值不会被丢弃 语句转换的值是指针,而不是指针指向的对象 class CFoo { int a; public: CFoo():a(1){} ~CFoo(){} getNum(){return a;} }; void tfunc(
类CFoo
{
INTA;
公众:
CFoo():a(1){}
~CFoo(){}
getNum(){返回一个;}
};
void tfunc(void*数据)
{
CFoo*foo=静态(数据);
标准::cout
当转换为空指针时,该值不会被丢弃
语句转换的值是指针,而不是指针指向的对象
class CFoo
{
int a;
public:
CFoo():a(1){}
~CFoo(){}
getNum(){return a;}
};
void tfunc(void* data)
{
CFoo* foo = static_cast<CFoo*>(data);
std::cout << "Number: " << foo->getNum();
delete foo;
}
int main()
{
CFoo* foo = new CFoo;
void* dt = static_cast<void*>(foo);
tfunc(dt); // or tfunc(static_cast<void*>(food));
return 0;
}
void*dt=static_cast(foo);
变量foo
的值是一些CFoo
对象的地址。该语句定义了一个新变量dt
,具有相同的值(即foo
和dt
都指向相同的地址),但编译器不允许您取消引用*dt
——它不允许您从该地址获取void
对象,因为void
类型没有值
当您的程序调用tfunc
时,形式参数data
也会获得相同值的副本(即,它指向相同的地址),最后,tfunc
内部的局部变量foo
也是如此
在tfunc
内部声明的本地foo
类型是指向CFoo
的指针,因此编译器将允许您取消引用该类型;而且,这是有意义的,因为您知道foo
实际上指向合法的CFoo
对象。没有任何内容被丢弃。您从哪里得到这个想法的?没有内容被丢弃scard。您只需告诉编译器指向CFoo
所在的地址即可。@DeiDei此外,即使是该教程的措辞也可能有不正确的解释。因为int a=3;(无效)当然,a;
对a
中的值没有任何作用;它只是在求值过程中丢弃从a
中提取的值的副本。如果我们将指针投射到void
,也不会对该指针引用的对象产生任何作用。转换不会损害原始值。如果我们转换3使用(double)3
将de>转换为浮点,我们有3.0
,现在仍然有3
。将转换为void
只是一种有时使用的计算死胡同。它表示“我们计算这个表达式只是为了它的副作用,根本不需要它的值”。或者“我们故意忽略此函数的返回值,这并非偶然”。它有时还用于消除编译器对未使用函数参数的警告。但我很少看到有人真正键入完整的静态转换(表达式);
。我通常只看到普通的C样式转换,即(void)表达式;
void* dt = static_cast<void*>(foo);