• 类型转换


    一、运算对象既包含无符号类型也有带符号类型

    1. 无符号类型不小于带符号类型,带符号的运算对象将转换成无符号的

    如:假设两个运算对象的类型分别为 unsigned int 和 int,那么 int 类型的运算对象将转换成 unsigned int 类型。

    	unsigned a = 0;
    	int i = -1;
    	auto x = a + i;		//x类型被自动转换为unsigned,在这个表达式a+i内,i的值转换为-1+2
    32
    	cout << a << " " << i << " " << x << endl;  //a为0,i为-1,x为4294967295
    

    表达式 a+i 中,i 的类型会被转换为 unsigned 类型,但是由于 i 是负值,所以 i 的值会变为这个负值加上无符号数的模(即232)。

    2. 无符号类型小于带符号类型,此时转换的结果依赖于机器

    1. 如果无符号类型的所有值都能存在该带符号类型中,则无符号类型的运算对象转换成带符号类型;
    2. 如果....................................不能....................................,则带符号类型的运算对象转换成无符号类型。

    二、指针的转换

    常量整数值0或字面值nullptr能转换成任意指针类型

    指向任意非常量的指针能转换成void *

    指向任意对象的指针能转换成const void *

    三、static_cast

    作用于:任何具有明确定义的类型转换,只要不包含底层const。

    其他:可以执行编译器无法自动执行的类型转换。

    如:double ans = static_cast<double>(j) / i;

    四、const_cast

    作用于:只能改变运算对象的底层const,不能改变表达式的类型

    其他:改变表达式的常量属性

    	const char *pc;					//底层const 
    	char *p = const_cast<char *>(pc);	//通过p写值是未定义的行为
    

    我们称“将常量对象转换成非常量对象的行为”为去掉const性质

    我们去掉某个对象的const性质后,便可以对该对象进行写操作,如果此对象是一个常量,则使用const_cast执行写操作会产生未定义的后果

    	const char *pc;						//底层const
    	char *q = static_cast<char *>(pc); 	//错误,static_cast不能去掉const性质
    	static_cast<string>(pc);			//正确,字符串字面值转换成string类型 
    	const_cast<string>(pc);				//错误,const_char只改变常量属性 
    

    补充:const_cast常常用于函数重载的上下文中

    五、reinterpret_cast

    看不懂!!!!!!!!!!!

  • 相关阅读:
    沈询:事务与分布式事务原理与实现
    c++ 幕客网
    Meet Dgraph — an open source, scalable, distributed, highly available and fast graph databas
    开发与系统管理----开发工具 左蓝
    奇虎360技术博客
    java 相关软件使用趋势
    长亭技术专栏 安全攻防技术分享
    tcp/ip RFC
    gentoo and arclinux
    孙鑫视频VC++深入详解学习笔记
  • 原文地址:https://www.cnblogs.com/xzxl/p/7655502.html
Copyright © 2020-2023  润新知