首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++:16---强制类型转换和类型转换

命名的强制类型转换具有如下形式: cast-name (expr); cast-name可以是:static_cast、const_cast、dynamic_cast、reinterpret_cast...*>(p); //将void*转换回初始的指针类型 二、const_cast 功能:用来将对象的常量性移除 注意事项: 只能改变运算对象的底层const const_cast只能改变表达式的常量属性,...*>(pc); 当我们去掉某个对象的const性质之后,编译器就不再阻止我们对该对象进行写操作了,因此写操作会产生未定义的后果 演示案例 const_cast只能改变表达式的常量属性,而不能改变表达式的数据类型...*>(ip); 我们必须牢记pc所指的对象是一个int而不是字符 如果把pc当成普通的字符指针使用那么就会产生未定义的后果。...: 我们想使用基类对象的指针或引用执行某个派生类操作,并且该操作不是虚函数 一般来说,只要有可能我们应该尽量使用虚函数。

2K20

《C++Primer》第四章 表达式

但是在C++语言中,两者的区别没有那么简单: 左值表达式的求值结果是一个对象或者一个函数,但是以常量对象为代表的某些左值却不能作为赋值语句的左侧运算对象 虽然某些表达式的求值结果是对象,但是它们实际上是右值而不是左值...vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间 因为sizeof的返回值是一个常量表达式,因此我们可以用sizeof的结果声明数组的维度 类型转换...隐式转换 比int类型小的整型值首先提升为较大的整型类型 在条件中,非布尔值转化为布尔值 初始化过程中,初始值转换为变量的类型;在赋值语句中,右侧运算对象转化为左侧运算对象的类型 如果算术运算或者关系运算的运算对象有多种类型...如果对象本身不是一个常量,那么使用强制类型转换获得写权限是合法的行为,但是如果对象是一个常量,再使用const_cast执行写操作就会产生未定义的后果: const char *pc; char *p...具有类似的功能。

86610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++补充知识&C++11及其特性

    右值(rvalue)——通过排他性来定义,每个表达式不是左值就是右值,rvalue是不在内存中占有确定位置的表达式,而是在存在寄存器中。 所有的左值(无论是数组,函数或不完全类型)都可以转化成右值。...(函数在栈上开辟空间存放形参和局部变量,这个变量所在内存空格占的位置不是固定的,再有一个函数压进栈来,原来的局部变量所在内存被覆盖。...把空指针转换成目标类型的空指针。 把任何类型的表达式转换成void类型。 (写了会提醒编译器检查,提醒其他程序员要注意。) (没事别转。)...);//整型转指针 int* val = reinterpret_cast(p);//指针转整型 Dog dog1; Animal* a1 = &dog1; Animal& a2 = dog1...在去掉常量限定符之前,保证指针所指向的内存可被修改,不能修改则会引起异常。

    40510

    static_cast ,reinterpret_cast

    ②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。 ③把空指针转换成目标类型的空指针。 ④把任何类型的表达式转换成void类型。...reinterpret_cast的作用是说将指针p的值以二进制(位模式)的方式被解释为整型,并赋给i,//i 也是指针,整型指针;一个明显的现象是在转换前后没有数位损失。...,以及基础类型之间的标准转换: 代码: double d = 3.14159265; int i = static_cast(d); (3)const_cast一般用于强制消除对象的常量性...它是唯一能做到这一点的C++风格的强制转型。这个转换能剥离一个对象的const属性,也就是说允许你对常量进行修改。...例如,试图使用一个const_cast以外的新风格 强制转型来消除常量性,代码将无法编译。

    2K100

    【计算机本科补全计划】《C++ Primer》:类型转换

    比int小的(一般是指位数,比如short这种16位的,int 是 32位)类型的整型值首先提升为整数类型 条件中, 非布尔类型转换成布尔类型 初始化过程中,初始值转变成变量的类型。...就比如说这个数能被另外一个更多位的类型容纳,并且在表达式内需要转换,那么就会如此转换。...转化成常量 允许将指向非常量的指针转化成指向相应的常量类型的指针,对于引用同样如此!...,这个句子会因为pc具有底层const而报错,但是因为有了const_cast,所以我们可以完成从常量到非常量的转变。...* reinterpret_cast 听说reinterpret_cast用起来十分危险,一不小心就会造成程序崩溃,所以为了大家的好习惯,我就不说了!自求多福吧 !

    68580

    C++的四种转换(const_cast、static_cast、dynamic_cast、reinterpreter_cast)

    static_cast 相当于C语言中的强制转换:(类型)表达式或类型(表达式),用于各种隐式转换 非const转const、void*转指针、int和char相互转换 用于基类和子类之间的指针和引用转换...在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。...如果没有virtual方法进行下行转换(指针或引用)会直接报错 const_cast 常量指针被转化成非常量的指针,并且仍然指向原来的对象; 常量引用被转换成非常量的引用,并且仍然指向原来的对象; const_cast...(重解释转换)几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用;随意的转换编译都会通过,但是不安全的转换运行时会异常 错误的使用reinterpret_cast很容易导致程序的不安全,只有将转换后的类型值转换回到其原始类型...reinterpret_cast不能转换掉表达式的const 可以用在将void*转换为int类型 unsigned short Hash( void *p ) { unsigned int val

    3.6K10

    C++高级主题系列篇

    具体实现方法: 通过 throw 语句和 try...catch 语句实现对异常的处理。 throw 表达式; 该语句拋出一个异常。 异常是一个表达式,其值的类型可以是基本类型,也可以是类。...,把基类指针转换成派生类指针,把一种函数指针转换成另一种函数指针,把常量指针转换成非常量指针等。...static_cast 用于: 风险低的转换,如整型和浮点型、字符型之间的互相转换。...2)reinterpret_cast reinterpret_cast 用于: 各种不同类型的指针之间、不同类型的引用之间以及指针和能容纳指针的整数类型之间的转换。...4.Lambda 思考:对于只使用一次的函数对象类,能否直接在使用它的地方定义呢?L 优势:Lambda 表达式可以减少程序中函数对象类的数量,使得程序更加优雅。

    46920

    c++基础之表达式

    在c++要区分左值和右值,可以采取一个原则:一般来说当一个对象被用作左值时,用的是对象的地址,也就是在内存中的位置,而右值可以采取排他性原则,只要不是左值的都是右值。..."pass" : "fail"; // 试图将cout 与 60 进行比较,错误 位运算符 位运算是作用与对象的二进制值的,理论上它可以处理任何对象,但是为了代码安全和可读性,建议只处理整型数据,而且最好是无符号整型...逗号表达式的返回值是右侧的表达式的值 类型转换 何时发生隐式转换 大多数情况下,比int小的整型值会被转化为int 条件中,非布尔值会被转化为布尔类型 初始化过程中,初始值转化为变量类型;赋值语句中右侧运算对象转化成左侧运算对象的类型...而且会尽量往精度较大的一方转化 调用函数时也可能会发生类型转化 算术类型转换 算术转换总是朝着精度更高的一级转换 较小的整型会被转化为int,较大的整型会被转化为long、unsigned long、unsigned...的被转化为false,其他的值被转化为true 转化为常量:常量的指针或者引用可以指向非常量对象,反过来则不行; 类类型定义的转化:由程序员预先定义,在需要转化时,由编译器自动调用进行转化 显式类型转换

    81410

    c++关键字完整列表及含义

    asm 内嵌汇编代码 auto 自动类型推断,让编译器根据初始化表达式推断变量的类型 bitand 位与运算符的替代表示符 bitor 位或运算符的替代表示符 bool 布尔类型 break 跳出当前循环或...字符(C++11) class 定义一个类 compl 位非运算符的替代表示符 const 定义常量或常量表达式 constexpr 定义编译时计算的常量表达式(C++11) const_cast 移除对象的常量性...允许其他类或函数访问私有和保护成员 goto 无条件跳转语句 if 条件语句 inline 建议编译器内联函数 int 整数类型 long 长整型数据类型 mutable 允许const对象的成员被修改...,受保护成员 public 类的访问修饰符,公开成员 register 建议编译器将变量存储在寄存器中(已废弃) reinterpret_cast 重新解释类型的强制类型转换 return 从函数返回值...short 短整型数据类型 signed 有符号类型修饰符 sizeof 计算类型或变量的大小 static 声明静态存储期的变量或类的静态成员 static_assert 编译时断言(C++11)

    18910

    C++中四种类型转换以及const_cast是否能改变常量的问题

    (cast away the constness) const_cast一般用于指针或者引用 使用const_cast去除const限定的目的不是为了修改它的内容 使用const_cast去除const...如果你遇到不能将整型转变为函数指针的问题,你可以这样解决: reinterpret_cast(nAddress); 注意LPFUN这里有个“&”符号,表示引用,C++的引用其实就是用指针实现的...二、也许大家都有过这样的疑惑:const_cast可以去除一个常量的const属性,去除const属性后应该可以对“常量”进行修改,通过调试器发现内存中的值是被改变的,可是再传递这个“常量”的时候,值却一直保持原状...可以明显地看出系统是对val这个const进行了预处理般的替换,将它替换成“64h”(十六进制的64就是十进制的100),即在编译生成的指令中val就已经被替换成100了,其实加const只是告诉编译器不能修改而不是真正地不可修改...,如果程序员不注意而去修改了它会报错,现在我们利用const_cast去除了常量性,然后通过指针和引用对其进行了修改,所以通过指针打印或者引用传参的时候就能看出其内存确实变化了,但为了保护val这个变量本来的

    1.4K100

    开讲啦:Chap 03 顺序程序设计

    常变量 如const int a = 3表示a被定义为一个整型变量,指定其值为3,而且在变量存在期间其值不能改变,常变量的与常量的异同是: 常变量具有变量的基本属性,即有类型、占内存单元,仅仅不允许被改变值...,符号常量就不存在了(全部置换成3.1415926),对符号常量的名字是不分配存储单元的; 常变量要占用存储单元,有变量值,只是该值不改变而已; 综上所述,常变量具有符号常量的优点,而且使用方便,有了常变量以后...:大写英文字母A~Z,小写英文字母a~z; 数字:0~9; 专门符号:29个(!...由一个表达式加一个分号构成,如i +=1是表达式,不是语句;i +=1;是语句; 空语句 只有一个分号,可以用来作为流程的转向点,也可以用来作为循环语句中的循环体; 复合语句 用{}把一些语句和声明括起来成为复合语句...,如+=、-=、*=、/=、%=; 赋值表达式 由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式,其形式为变量 赋值运算符 表达式,其作用是将一个表达式的值赋给一个变量,因此赋值表达式具有计算和赋值两个功能

    69820

    static_cast, dynamic_cast, reinterpret_cast, const_cast区别

    深入地说,数据在内存中是没有“类型”一说的,比如0x3F可能是字符型,也可能是整型的一部分,还可能是地址的一部分。我们定义的变量类型,其实就是定义了数据应该“被看成什么”的方式。...注意这时不是以warning形式给出的,而直接是不可通过编译的error。...更厉害的是,reinterpret_cast可以把整型数转换成地址(指针),这种转换在系统底层的操作,有极强的平台依赖性,移植性不好。...,但切记,这个转换并不转换原常量本身,即c还是常量,只是它返回的结果cc是非常量了。...,甚至可以直接将整型值转成指针,这种转换是底层的,有较强的平台依赖性,可移植性差;const_cast可以将常量转成非常量,但不会破坏原常量的const属性,只是返回一个去掉const的变量。

    85820

    第4章 表达式

    算术类型转换,将运算对象转换成最宽的类型。比如表达式中既有浮点型也有整型数据时,整数会转换成相应的浮点型。 3. 数组转换成指针。大多数情况下,数组都能转换成指向首元素的指针。...而在进行模板实参推断时,如果函数形参不是引用类型,则可以将数组或函数类型转换为普通的指针;相反则不可以。 4. 指针的转换。     1....派生类指针或引用能转换成基类的指针或引用。 5. 算术或指针类型向布尔类型的转换。 6. 指向非常量的指针或引用转换成相应的常量类型的指针或引用。 7. 类类型定义的转换。...任何具有明确定义的类型转换,只要不包括底层 const,都可以使用 static_cast。...只能改变运算对象的底层 const,将常量对象转换成非常量对象。 reinterpret_cast。对运算对象提供较低层次上的重新解释,使用起来非常危险,一般不建议使用。 dynamic_cast。

    59840

    Rust基础语法(变量、常量、数据类型)

    变量,基本类型,函数,注释和控制流,这些几乎是每种编程语言都具有的编程概念。...变量 变量的命名规则 Rust 中的变量名并不是随便什么字符都可以的,它遵循着一套规则 变量名中可以包含 字母、数字 和 下划线。...声明常量使用 const 关键字而不是 let,并且 必须 注明值的类型。在下一部分,“数据类型” 中会介绍类型和类型注解,现在无需关心这些细节,记住总是标注类型即可。...常量可以在任何作用域中声明,包括全局作用域,这在一个值需要被很多部分的代码用到时很有用。 最后一个区别是,常量只能被设置为常量表达式,而不可以是其他任何只能在运行时计算出的值。...Rust 对常量的命名约定是在单词之间使用全大写加下划线。编译器能够在编译时计算一组有限的操作,这使我们可以选择以更容易理解和验证的方式写出此值,而不是将此常量设置为值10,800。

    66720

    记一次阿里实习生电面经历

    B类地址我们就读取short的第一个元素来)” 当然了现在的struct in_addr 里面实际上只是包含一个整型的结构体了。不是联合了。上面关于in_addr和联合的说法是从《UNP》上看来的。...(其实读过一点的经典书籍还有很多……)” 6. const指针 问:“声明一个常量指针,指向一个整型,但指向的地址不可变” 哎,这个我知道是重点,也是容易混淆的知识点,前几天我还特地整理了一下。...表面上const * a const在星号前面应该是修饰指针的,但是要反转记忆一下,它是修饰变量的。即变量是常量。...const a表面上,cosnt在a前面应该是修饰变量的,实际上它是修饰指针的,即地址是常量不能变。 7....二面的时候面试官又问了同样的问题,不过问的细节更多,他说可以用static_cast来转换指针为整型。我后来试了一下发现不可以。。会报错的。

    44710

    【C++】类型转换 ① ( C 中的类型转换 | C++ 类型转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast )

    中提供了 四种 类型转换操作符 : 静态类型转换 static_cast : 在编译时进行 , 将一种数据类型安全地转换为另一种数据类型 , 转换前提是在编译时两个数据类型已知 ; // 静态类型转换 整型...-> 浮点型 int num = 10; float fnum = static_cast(num); 重新解释类型 reinterpret_cast : 对指针变量 , 引用变量进行原始的转换...| C++ 语言中常量原理 - 符号表存储常量 ) 博客 ; C 语言常量 本质是 内存中的一块空间 , 可以通过 & 获取地址修改 ; C++ 常量 本质是 创建了一个符号表区域 , 使用键值对形式存储常量值...; 3、C 语言和 C++ 类型转换联系 C++ 中的 静态类型转换 static_cast 和 重新解释类型 reinterpret_cast 对应 C 语言中的 强制类型转换 , C++ 中的 动态类型转换...dynamic_cast 和 常量转换 const_cast 是 C++ 独有的 , 因为 C 语言中没有 子类父类 继承概念 , C++ 中的常量的本质 与 C 语言也是不同的 ;

    22910

    【C++】一文掌握C++的四种类型转换 --- static_cast、reinterpret_cast、const_cast、dynamic_cast

    1 C++中的类型 C++中类型分为两种:内置类型和自定义类型。内置类型中分为算术类型和空类型。其中算术类型包含字符,整型,布尔值和浮点数。...整型之间,浮点数和整型之间 显式类型转化(强制类型转换):需要用户自己处理,各类指针是可以显式类型转换的!...也就是说,只要是C风格的类型转换,可以都套上static_cast! 任何具有明确定义的类型转换,只有是不包括底层const,都可以使用static_cast!...reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型 3.3 const_cast 去常转换 const_cast 只能改变运算对象的底层...为了适配常量字符串和非常量字符串,我们需要进行一个函数重载: const string& func(const string& s1 , const string& s2) { return s1.size

    19210

    C++复习笔记——C++ 关键字

    auto auto(自动,automatic)是存储类型标识符,表明变量"自动"具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。...常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。...它使程序跳过代码段后部的部分,与 break不同的是,continue 不是进入代码段后的部分执行,而是重新开始新的循环。因而它是"继续循环"之意,不是break(跳出)。...int int(整型,integer),C++ 中的基本数据结构,用于表示整数,精度小于long。...把任何类型的表达式转换成void类? 注意 static_cast不能转换掉 expression 的 const、volitale、或者 __unaligned 属性。

    1.3K30

    C语言入门系列之2.数据类型、运算符和表达式

    数据类型,运算符和表达式 一、数据类型 1.数据类型 2.常量和变量 常量和符号变量 变量 3.整型数据 整型常量的表示方法 整型变量 4.实型数据 Ⅰ.实型常量的表示方法 Ⅱ.实型变量 实型数据在内存中的存放形式...整型量包括整型常量、整型变量。 常量和符号变量 在程序执行过程中,其值不发生改变的量称为常量。 符号常量:用标示符代表一个常量。 在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。...除法运算符/ 双目运算,具有左结合性。 参与运算量均为整型时,结果也为整型,舍去小数;如果运算量中有一个是实型,则结果为双精度实型。...i + j 赋值表达式的功能是计算表达式的值再赋予左边的变量,具有右结合性,因此a=b=c=5可理解为 a=(b=(c=5))。...并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中和函数参数表中逗号只是用作各变量之间的间隔符。

    2.8K10

    2.Go编程快速入门学习

    1.标识符 描述: 在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名、常量名、函数名等等。 Go语言中标识符由字母数字和(下划线)组成,并且只能以字母和开头。...# 下划线连接 student_name # 小驼峰法式 (推荐方式) studentName # 大驼峰法式 StudentName 2.关键字 描述: 关键字是指编程语言中预先定义好的具有特殊含义的标识符...const ( n1 = 100 n2 n3 ) iota - 常量计数器 描述: iota是go语言的常量计数器,只能在常量的表达式中使用。...(未类型转换):", r1) fmt.Println("修改后中文字符串输出(已类型转换):", s1, string(r1)) // 强制转化rune切片为字符串 // 将整型转化成为浮点数类型.../ 相除 % 求余 注意: ++(自增)和--(自减)在Go语言中是单独的语句,并不是运算符。

    98330
    领券