与const_cast混淆了

时间:2012-12-26 14:07:40

标签: c++ const-cast

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个示例程序中标记为错误的概念吗?

3 个答案:

答案 0 :(得分:1)

1)您正在将(const int *)转换为(int *)。因此,由于const修饰符,您无法更改放置在该地址的值(指针指向内存中的某个地址)。当您将其强制转换为(int *)时,编译器将允许更改该地址的数据。

2)您正在尝试将(const int)转换为指向int(int *)的指针。 (int)和(int *)是不同的类型。这与ask const_cast将字符串转换为float相同。 const_cast运算符不能更改变量的类型。要做这些事情你应该看看static_cast或reinterpret_cast。

3)您将const int转换为对int的引用并将值赋给int(您只需将该值复制到新变量)。这可能不是你想要的,因为在这种情况下改变j不会改变我。您可以创建对int而不是j的引用,然后您可以更改i的值。

4)我不明白你在这里要做什么。 const_cast的想法是删除对象的const保护。因此,此操作仅适用于指针和引用。您不需要任何强制转换将const int复制到int。但是,在取得指针或引用并删除保护之前,您无法更改i的值。

结论。删除const是一种糟糕的编程风格。假设您编写了一个函数具有const int *参数的库。您的库的用户将确保他的int不会改变,但您更改了它并且他丢失了他所需的数据。

答案 1 :(得分:0)

写作时

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

您正在尝试将“i”转换为指针。 const_cast并不意味着用于更改数据类型。

也许你的意思是

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

答案 2 :(得分:0)

这是第一个解释的陈述:

[强制转换为非const int指针]([获取指向'i'(const)的指针));

   const_cast<int*>   (        &i            );

这是第二个声明:

[强制转换为非const int指针]([获取'i'的值]);

   const_cast<int*>    (     i       );

错误是因为整数值不是指针值,因此,const_cast不能执行该转换。它只能将指针映射到指针或引用的引用。

以下是第三条陈述:

[强制转换为非const int引用]([隐式获取对'i'(const)的引用]);

    const_cast< int& >    (   i  );

这是第二个声明:

[cast to non-const int value]([获取'i'(const)的值]);

   const_cast< int >      (     i   );

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

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

相关问题