c++中,const_cast类型转换问题

问题描述

c++中,const_cast类型转换问题

#include
using namespace std;

void foo(const int a)
{
int *p = const_cast<int
>(a);
*p = 10;
cout << *a << endl; //输出10
cout << a << endl;
}
int main()
{
const int n = 100;
foo(&n);
cout << n << endl; //输出100
cout << &n << endl;//&n和foo函数中的a的值是相等的,但是对一个地址取内容为什么会不同呢?

cout << (&n) << endl; // 输出100
int *x = (int
)&n;

cout << *x << endl; //输出10 为什么?
return 0;
}

解决方案

这类属于“未定义行为”,由编译器自己决定怎么实现。
可以理解为编译器在编译 cout << ncout << (&n) 的时候是直接把 n的常量值100进行输出了,而不是从n所在的地址取得值后再输出。
*p = 10是的的确确在更改n所在的地址存放的值,其它同样通过间接的地址、指针取得的值就是更改后的 10 了。
概括起来,就是编译器知道那是个常量的地方直接用了常量。

解决方案二:

C++:const_cast类型转换
C++ 新的类型转换(const_cast)
C++类型转换详解--const_cast

解决方案三:

你拿int 和 int * 互相转出错很正常啊, 在64位操作系统中 一般 int 占 32位, int * 占64位, 然后就导致了地址不同

解决方案四:

你用的是哪个编译器?
1.foo 函数要求传的参数为 const int ,而你却传了 const int* -->foo(&n);

2.const_cast 是去常转换,能这样用 int *p = const_cast(a);??

3.foo 函数当中 a 是 const int 类型,cout << *a << endl; ,*a这个操作是干嘛的?

解决方案五:

 #include<iostream>

using namespace std;
void foo(const int *a)
{
    int *p = const_cast<int*>(a);
    *p = 10;
    cout << *a << endl; //输出10
    cout << a << endl;
}
int main()
{
    const int n = 100;
    foo(&n);
    cout << n << endl; //输出100
    cout << &n << endl;//&n和foo函数中的a的值是相等的,但是对一个地址取内容为什么会不同呢?
    cout << (&n) << endl; // 输出100
    int *x =(int*)&n;

    cout << *x << endl; //输出10 为什么?
    return 0;
}

之前代码上传的时候,出错了。源代码如上。

时间: 2024-10-04 10:42:32

c++中,const_cast类型转换问题的相关文章

C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结_C 语言

前言 这篇文章总结的是C++中的类型转换,这些小的知识点,有的时候,自己不是很注意,但是在实际开发中确实经常使用的.俗话说的好,不懂自己写的代码的程序员,不是好的程序员:如果一个程序员对于自己写的代码都不懂,只是知道一昧的的去使用,终有一天,你会迷失你自己的. C++中的类型转换分为两种: 1.隐式类型转换: 2.显式类型转换. 而对于隐式变换,就是标准的转换,在很多时候,不经意间就发生了,比如int类型和float类型相加时,int类型就会被隐式的转换位float类型,然后再进行相加运算.而关

java类型转换-java中的类型转换问题

问题描述 java中的类型转换问题 ①ClassCastException②错误:不兼容的类型 这两有什么区别?如何判断何种情况下跑出哪一个呢? 解决方案 既然是Exception,编译的时候肯定发现不了啦.只能程序跑的的时候抛出.一般都是因为使用父类或者接口类型做变量的类型的时候在进行转型时候发生 例如 Object obj = factory.createString()在应用的时候却用 Integer it = (Integer)obj ②错误:不兼容的类型首先编译的时候可以发现这个错误的

oracle中类型转换-oracle中number类型转换

问题描述 oracle中number类型转换 to_char(min(a.l_entrust_time),'HH24:mm:ss') 其中a.l_entrust_time在数据库中为number类型,如:140930,想转为14:09:30应该怎么转换 解决方案 问题解决....to_char(to_date(min(a.l_report_time),'hh24:mi:ss'),'hh24:mi:ss')

c++-C++中一个类型转换的问题。

问题描述 C++中一个类型转换的问题. //第一个 // Expression.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include #include"SeqStack.cpp" using std::cout; using std::endl; using std::cerr; double Operate(double a,char pre_op,double b); char Precede(char pre

《Java 7程序设计入门经典》一2.12 赋值中的类型转换

2.12 赋值中的类型转换 在编程中,常常需要将一种类型的变量赋值给另一种类型的变量.例如,要把int值赋给float变量,如: 当在一个赋值语句中有兼容的类型时,运算符右边的值自动转换为左边的类型.于是,在上面的代码片段中,变量i的值转换为float类型,然后赋给变量f.但是,由于Java有严格的类型检查,不是所有的类型都互相兼容,因此,不是所有的隐式转换都允许发生.例如,boolean类型与int类型就不兼容. 当把一种类型的数据赋给另一种类型的变量时,在以下情况下会发生自动类型转换(aut

浅谈Java中强制类型转换的问题_java

为了更好的理解我们先看下面的例子: package com.yonyou.test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * 测试类 * @author * @创建日期 2016-5-31 */ public class Test{ public static void main(String[] args) { List<String> list=new Array

SQL SERVER中强制类型转换cast和convert的区别详解_MsSql

SQL SERVER中强制类型转换cast和convert的区别 在SQL SERVER中,cast和convert函数都可用于类型转换,其功能是相同的, 只是语法不同. cast一般更容易使用,convert的优点是可以格式化日期和数值. select CAST('123' as int) -- 123 select CONVERT(int, '123') -- 123 select CAST(123.4 as int) -- 123 select CONVERT(int, 123.4) --

C#中的类型转换大总结

使用C#一个最常见的问题便是各种类型间的转换. 我们知道,C#中的类型分为值类型和引用类型两大类.但是,有关它们间各自转换的细节描述在网上很少得到详细的回答.现在,我结合搜索到的部分资料整理如下: 1,问题 c#中类型转换的有两种,()转换和convert转换. 我想知道的是这两个转换的区别 还有就是()转换我用了发现好多不能转换过来,但是convert是万能转换的,那什么时候该用()什么时候该用convert呢? 最后问下子,把int sum 怎么用()转换成float类型? 请详细说明,最好

About Cast in C++(C++中的类型转换)

原文:http://hi.baidu.com/_%E2d_%B7%B3_%DE%B2%C2%D2/blog/item/b46a27d9dc50c0ed39012f8f.html C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的语法: T(exdivssion) // cast exdivssion to be of type T   这两种形式之