Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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
我被康斯特的演员弄糊涂了 示例程序-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 - Fatal编程技术网

我被康斯特的演员弄糊涂了 示例程序-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   );