zoukankan      html  css  js  c++  java
  • 第11课.新型的类型转换

    1.新型类型转换

    c++将强制类型转换分为4种不同的类型
    static_cast
    const_cast
    dynamic_cast
    reinterpret_cast
    用法:

    xxx_cast<Type>(Expression)
    

    static_cast

    a.用于基本类型间的转换
    b.不能用于基本类型指针间的转换
    c.用于有继承关系类对象之间的转换和类指针之间的转换
    d.可以用于基本类型和类类型的转换

    const_cast

    a.用于去除变量的只读属性
    b.强制转换的目标类型必须是指针或引用

    reinterpret_cast

    a.用于指针类型间的强制转换
    b.用于整数和指针类型间的强制转换

    dynamic_cast

    a.用于有继承关系的类指针间的转换
    b.用于有交叉关系的类指针间的转换
    c.具有类型检查的功能
    d.必需要虚函数的支持

    dynamic_cast是与继承相关的类型转化的关键字
    dynamic_cast要求相关的类中必须有虚函数
    用于有直接或间接继承关系的指针(引用)之间

    a.指针
     转换成功:得到目标类型的指针
     转换失败:得到一个空指针

    b.引用:
     转换成功:得到目标类型的引用
     转换失败:得到一个异常操作信息

    eg:

    #include <stdio.h>
    
    void static_cast_demo()
    {
    	int i = 0x12345;
    	char c = 'c';
    	int* pi = &i;
    	char* pc = &c;
    	
    	c = static_cast<char>(i);		//int型的i转化为char型,赋值给c
    	pc = static_cast<char*>(pi);	//error
    }
    
    void const_cast_demo()
    {
    	const int& j = 1;
    	int& k = const_cast<int&>(j);
    	
    	const int x = 2;        //进入符号表,为常量
    	int& y = const_cast<int&>(x);    //这里去掉的是地址的只读属性,不是进入符号表的x的只读属性
    	
    	int z = const_cast<int>(x);		//error,目标只能是指针或引用
    	
    	k = 5;
    	
    	printf("k = %d
    ", k);
    	printf("j = %d
    ", j);
    	
    	y = 8;
    	
    	printf("x = %d
    ", x);
    	printf("y = %d
    ", y);
    	printf("&x = %p
    ", &x);
    	printf("&y = %p
    ", &y);
    }
    
    void reinterpret_cast_demo()
    {
    	int i = 0;
    	char c = 'c';
    	int* pi = &i;
    	char* pc = &c;
    	
    	pc = reinterpret_cast<char*>(pi);
    	pi = reinterpret_cast<int*>(pc);
    	pi = reinterpret_cast<int*>(i);
    	c = reinterpret_cast<char>(i); 		//error
    }
    
    void dynamic_cast_demo()
    {
    	int i = 0;
    	int* pi = &i;
    	char* pc = dynamic_cast<char*>(pi);		//error
    }
    
    int main()
    {
    	static_cast_demo();
    	const_cast_demo();
    	reinterpret_cast_demo();
    	dynamic_cast_demo();
    	
    	return 0;
    }
  • 相关阅读:
    Centos7下thinkphp5.0环境配置
    win10蓝牙鼠标无法连接,需pin码
    thinkphp5自带workerman应用
    php文件加密(screw方式)
    centos修改ssh默认端口号的方法
    修改CentOS ll命令显示时间格式
    在线编辑器的原理简单示例
    [转载]提升SQLite数据插入效率低、速度慢的方法
    linux 客户机挂载vitualbox共享文件夹
    virtualbox linux客户机中安装增强功能包缺少kernel头文件问题解决
  • 原文地址:https://www.cnblogs.com/huangdengtao/p/11792385.html
Copyright © 2011-2022 走看看