Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 转换为空指针时是否放弃该值?_C++ - Fatal编程技术网

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);