2012-12-26 142 views
0
Sample_Program-1 

#include<iostream> 
using namespace std ; 

int main(){ 
const int i = 9; 
int *j = const_cast<int*>(&i); //Ok 
int *j = const_cast<int*>(i); //Error 
} 

Sample_Program-2 

#include<iostream> 
using namespace std ; 

int main(){ 
const int i = 9; 
int j = const_cast<int&>(i);//Ok 
int j = const_cast<int>(i);//Error 
} 

我刚刚学习了一些C++概念并且遇到了上述2个概念。任何人都可以请解释我在上面的2示例程序中标记为错误的概念吗?与const_cast相混淆

回答

0

这里是第一个语句解释:

[浇铸到非const int的指针]([获取一个指针 'I'(常数)]);

const_cast<int*> (  &i   ); 

这里是第二条语句解释:

[投射到非const int的指针]([得到的值 'I']);

const_cast<int*> ( i  ); 

错误是因为一个整数值不是一个指针值,所以const_cast不能这样做。它只能映射指向指针的指针或对引用的引用。

这里是第三个语句解释:

[浇铸到非const int的参考]([隐式得到一个参考 'I'(常数)]);

const_cast< int& > ( i ); 

这里是第二条语句解释:

[投射到非const int值]([得到的值 'I'(常数)]);

const_cast<int>  ( i ); 

错误是因为const_cast不能用于在值之间进行转换,只能在指针或引用之间进行转换。对于价值观,我们谈论“转换”而不是转换。如在:

int i_nc = i; //确定:因为值被复制,所以不需要进行const-cast。 转换是一种将一种类型的对象的值复制到另一种类型的对象中的方法。铸造操作员对此目的没有意义。

0

当你写

int *j = const_cast<int*>(i); 

你正试图转换的 'i' 为指针。 const_cast并不意味着用于更改数据类型。

也许你的意思

int *j = const_cast<int*>(&i); 
+0

::好的我了解了你的第一点,即const_cast不适用于数据类型转换。但是在第二种情况下有什么魔法? – Kenta

+0

&给出变量的地址。 –

1

1)你是铸造(const int的*),与(int *)。因此,由于const修饰符,您不能更改放置在该地址的值(指向内存中某个地址的指针)。当你将它转换为(int *)时,编译器将允许在该地址更改数据。

2)您正试图将(const int)强制转换为指向int(int *)的指针。 (int)和(int *)是不同的类型。这与要求const_cast将字符串转换为浮点数相同。 const_cast运算符不能更改变量的类型。要做出这样的事情,你应该看看static_cast或者reinterpret_cast。 3)您将const int引用为int并将其赋值给int(您只需将该值复制到新变量中)。这可能不是你想要的,因为在这种情况下改变j不会改变i。您可以创建对int的引用而不是j,然后可以更改i的值。

4)我不明白你在这里做什么。 const_cast的想法是删除对象上的const保护。所以这个操作只能在指针和引用上使用。您不需要任何强制转换将const int复制到int。但是你不能改变我的价值,直到你拿起指针或参考并移除保护。

结论:删除const是一种不好的编程风格。假设你编写了一个函数具有const int *参数的库。你的库的用户可以确定他的int不会改变,但你改变了它,并且他丢失了他需要的数据。