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

4

3 回答 3

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。但是在获取指针或引用并删除保护之前,您无法更改 i 的值。

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

于 2012-12-26T14:35:06.273 回答
0

当你写

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

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

也许你的意思是

int *j = const_cast<int*>(&i); 
于 2012-12-26T14:11:12.910 回答
0

这是解释的第一个语句:

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

   const_cast<int*>   (        &i            );

这是解释的第二个语句:

[强制转换为非 const int 指针] ([get value of 'i']);

   const_cast<int*>    (     i       );

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

这是解释的第三个语句:

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

    const_cast< int& >    (   i  );

这是解释的第二个语句:

[强制转换为非 const int 值] ( [get value of 'i' (const)] );

   const_cast< int >      (     i   );

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

int i_nc = i; // OK:不需要 const-cast,因为值被复制了。转换是一种将一种类型的对象的值复制到另一种类型的对象的方法。铸造运营商对此没有意义。

于 2012-12-26T19:15:02.720 回答