我被康斯特的演员弄糊涂了 示例程序-1 #包括 使用名称空间std; int main(){ 常数i=9; int*j=const_cast(&i);//确定 int*j=const_cast(i);//错误 } 样本程序-2 #包括 使用名称空间std; int main(){ 常数i=9; int j=const_cast(i);//好的 int j=const_cast(i);//错误 } 我刚刚学习了一些C++概念,并符合上述2个概念。有人能解释一下我在上面2个示例程序中标记为错误的概念吗?
当您编写我被康斯特的演员弄糊涂了 示例程序-1 #包括 使用名称空间std; int main(){ 常数i=9; int*j=const_cast(&i);//确定 int*j=const_cast(i);//错误 } 样本程序-2 #包括 使用名称空间std; int main(){ 常数i=9; int j=const_cast(i);//好的 int j=const_cast(i);//错误 } 我刚刚学习了一些C++概念,并符合上述2个概念。有人能解释一下我在上面2个示例程序中标记为错误的概念吗?,c++,const-cast,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 name
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
}
1) 您正在将(常量int*)转换为(int*)。因此,由于常量修饰符的存在,您无法更改位于该地址的值(指针指向内存中的某个地址)。当您将其强制转换为(int*)时,编译器将允许在该地址更改数据
2) 您正试图将(const int)强制转换为指向int(int*)的指针。(int)和(int*)是不同的类型。这与要求const_cast将字符串转换为float相同。const_cast运算符无法更改变量的类型。要制作这样的东西,你应该看静态或重新解释
3) 将const int强制转换为对int的引用,并将值赋给int(只需将值复制到一个新变量)。这可能不是您想要的,因为在这种情况下更改j不会更改i。您可以创建对int而不是j的引用,然后可以更改i的值
4) 我不明白你在这里想干什么。const_cast的思想是移除对象上的const保护。因此,此操作只能在指针和引用上进行。将const int复制到int不需要任何强制转换,但在获取指针或引用并移除保护之前,无法更改i的值
结论:删除常量是一种糟糕的编程风格。假设您编写了一个函数具有const int*参数的库。您库的用户将确保他的int不会更改,但您更改了它,他丢失了所需的数据。以下是解释的第一句话: [cast to non-const int pointer]([get a pointer to'i'(const)])
const_cast&i;
下面是解释的第二句话:
[强制转换为非常量int指针]([获取'i'的值])
const_cast(i);
错误是因为整数值不是指针值,因此const_cast无法执行该转换。它只能将指针映射到指针,或将引用映射到引用
以下是第三种解释:
[cast to non-const int reference]([隐式获取对'i'(const)]的引用)
const\u cast(i);
下面是解释的第二句话:
[cast to non-const int value]([get value of'i'(const)])
const_cast(i);
错误是因为const_cast不能用于值之间的转换,只能用于指针或引用之间的转换。对于值,我们讨论的是“转换”,而不是强制转换。例如:
int i_nc=i代码>//确定:由于复制了值,因此不需要常量强制转换。
转换是将一种类型的对象的值复制到另一种类型的对象的方法。强制转换运算符在这方面没有意义。::好的,我了解了您的第一点,即const_cast并不用于数据类型转换。但是,在第二种情况下,magic&会做什么呢?&给出了变量的地址。
int *j = const_cast<int*>(i);
int *j = const_cast<int*>(&i);
const_cast<int*> ( &i );
const_cast<int*> ( i );
const_cast< int& > ( i );
const_cast< int > ( i );