C++的类型转换(强转)你了解吗

目录
  • 静态类型转换
  • 动态类型转换
  • 常量转换
  • 重新解释转换
  • 总结

静态类型转换

关键字: static_cast

1,允许内置数据类型之间的转换

    char a = 'a';
	double b = static_cast<double>(a);
	cout << b << endl;//97
	return 0;

<>中是转后的数据类型。()中是要转的变量名称。

2,允许子类和父类之间指针或者引用的转换

向上类型转换是安全的。(子转父)

向下类型转换是不安全的。(父转子)

指针转换:

class Animal
{
};
class Dog :public Animal
{
};
class Other
{
};
int main()
{
	Animal* animal = NULL;
	Dog* dog = NULL;
	//将animal转为Dog*(向下类型转换,不安全)
	Dog * dog2 = static_cast<Dog*>(animal);
	Other* other = static_cast<Other*>(animal);//这个时候就会出错了,因为两个指针不是父子关系。
	return 0;
}

所以,父类和子类的指针可以通过静态转换而进行转换。

引用转换:

Animal animal;
Dog dog;
Animal& animalCopy = animal;
Dog& dogCopy = static_cast<Dog&>(animalCopy);
Dog& dogCopy2 = dog;
Animal& animalCopy2 = static_cast<Animal&>(dogCopy2);

在创建了对象以后,创建对象的引用,然后可以将创建的引用转换为子/父类的引用类型。

动态类型转换

与静态类型转换几乎一样,比静态类型转换更加安全。(因为在进行向下类型转换的时候具有类型检查的功能;如果会丢失精度或信息的情况下就不允许转换)

关键字:dynamic_cast

1,不允许内置数据类型之间的转换

2,父类和子类之间

(1)允许父子之间指针或者引用的转换。

(2)有些时候父转子会出现问题。如果发生了多态,那么转换总是安全的。多态就是用父类的指针指向子类的对象,且父类中有虚函数,子类重写父类中的虚函数。

常量转换

关键字:const_cast

该运算符用来修改类型的const属性(若原先是常量,那么使用后变为非常量;若原先是非常量,那么使用后变成常量)

(1)常量指针被转化为非常量指针,并且指向原对象。

(2)常量引用被转换成非常常量引用,并且指向原对象。

注意:此关键字只针对指针和引用,不能对其他const属性进行修改。

	//指针:
	const int* p = NULL;
	int* pp = const_cast<int*>(p);
	const int* ppp = const_cast<const int*>(pp);
	//引用:
	int num = 10;
	int& num2 = num;
	const int& num3 = const_cast<const int&>(num2);

重新解释转换

不安全的转换。(可以将int类型转换为int*类型)

关键字:reinterpret_cast<int*>(a)

	int a = 10;
	int* p = reinterpret_cast<int*>(a);

不同类(毫无关系的类)的指针之间也可以进行转换。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C++类型转换运算符详解

    目录 老式显式类型转换 c++的显示类型转换 为什么要有新的类型转换 具体应该使用哪种转换 static_cast运算符 dynamic_cast运算符 const_cast运算符 reinterpret_cast运算符 老式显式类型转换实际的转换方式 总结 老式显式类型转换 (类型)表达式 c风格的强制类型转换 类型(表达式) 函数式的强制类型转换 1,最开始使用的是c风格的类型转换,但是为了能够使类型转换看起来更像是一个函数调用,因此引入了函数式的类型转换.函数式的类型转换能够像使用一个函数

  • C++中图片类型的识别与转换详解方法

    目录 1.图片类型的识别 1.1.bmp图片 1.2.jpg图片 1.3.jpg图片 1.4.gif图片 1.5.tiff图片 1.6.使用CreateFile和ReadFile API函数读取内容 2.图片之间的相互转换 1.图片类型的识别 一般情况下,不同类型的图片文件都会有其对应的后缀名,比如.jpg..bmp..jpg等.但仅仅通过后缀名,是没法判别文件是不是图片以及图片文件真实类型,必须通过文件内容的起始标记字段才能判断出来. 每种图片文件的类型标识字段存储于文件内容开始的几个字节,读

  • C++ 的类型转换详解

    目录 一.C++ 类型转换 1.静态类型转换 1.语法格式 2.转化规则 2.重解释类型转换 1.语法格式 2.转化规则 3.常类型转换 1.语法格式 2.语法规则 3.const 常变量(补充) 4.动态类型转换 1.语法格式 总结 一.C++ 类型转换 1.静态类型转换 1.语法格式 static_cast<目标类型> (标识符) 2.转化规则 在一个方向上可以作隐式转换,在另外一个方向上就可以作静态转换. int a = 10; int b = 3; cout<<static

  • C++ 强制类型转换详解

    目录 一.C强制转换 二.C++强制转换 1.static_cast 静态转换(编译时检查) 2.const_cast 常量转换 3.reinterpret_cast 重新解释转换 4.dynamic_cast 动态转换(运行时检查) 三.要点总结 一.C强制转换 C语言中的强制转换主要用于普通数据类型.指针的强制转换,没有类型检查,转换不安全, 语法为: (type-id)expression//转换格式1 type-id(expression)//转换格式2(基本已经不用了) 二.C++强制

  • C++类型转换详解

    目录 内置类型的转换 自定义类型转换 explicit 关键字 提醒 提问:编译器在什么时候使用Stone(double)? 转换函数 概念介绍 自动引用类型转换 缺陷 总结 C++对于内置类型有隐式或显式的类型转化,如int,double,long,char,但是,C++还有类这个概念,类是一种自定义类型,为了让类(自定义类型)达到内置类型的层次,C++对类也挺提供一些方法进行自动或者强制类型转换 C++的好多工作,在我看来就是让自定义类型能和内置类型一样简单使用.操作. 内置类型的转换 in

  • C++的类型转换(强转)你了解吗

    目录 静态类型转换 动态类型转换 常量转换 重新解释转换 总结 静态类型转换 关键字: static_cast 1,允许内置数据类型之间的转换 char a = 'a'; double b = static_cast<double>(a); cout << b << endl;//97 return 0; <>中是转后的数据类型.()中是要转的变量名称. 2,允许子类和父类之间指针或者引用的转换 向上类型转换是安全的.(子转父) 向下类型转换是不安全的.(父

  • C#使用is、as关键字以及显式强转实现引用类型转换

    在C#中,当引用类型需要转换的时候,经常会用到关键字is.as以及显式强转.本篇来体验这三者的用法. 先来梳理.NET引用类型转换的"约定俗成",或者叫"惯例": 子类可以隐式转换为父类/基类,也就是"里氏替换原则"所说的:子类必须能够替换其父类/基类. 父类/基类转换为子类时,必须进行显式类型强转. 子类转换成父类 class Program { static void Main(string[] args) { Animal animal =

  • C#基础之数据类型转换

    int x; long y = 123456789101112; x = (int)y; Console.WriteLine(x); 输出结果: 我们知道long类型的取值范围是-9223372036854775805~+9223372036854775807:int类型的是:-2147483648~+2147483647 上面的代码中,由于long变量的值超过了int能容纳的最大值,造成了数据的丢失:像这样有可能造成数据丢失或引发异常的任何转换都需要执行显式转换(explicit); 相反的就

  • 详解Swift中的数据类型类型转换

    一.类型检查与转换 在Objective-C和Java中,任何类型实例都可以通过强转使编译器认为它是另一种类型的实例,这么做其实是将所有的安全检查工作都交给了开发者自己来做.先比之下,Swift中的Optional类型转换就会比较安全与可靠. Swift中使用is关键字来进行类型的检查,其会返回一个布尔值true或者false来表明检查是否成立,示例如下: var str = "HS" if str is String { print(str) } Swift中有向上兼容与向下转换的特

  • 关于C++的强制类型转换浅析

    前言 一说起强制类型转换大家都很熟悉,相信很多学习完C++的朋友还在使用C语言的强制类型的方式 (类型)变量. C++其实也具有自己的一套强制类型转换它们分明是:static_cast  reinterpret_cast  const_cast  dynamic_cast四种类型. 那么肯定会有人好奇C++是不是闲,C语言的强制类型用的舒舒服服的,为什么要新推出来这几个? 新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换.C++中风格是static_cast<typ

  • 浅析Java中对象的创建与对象的数据类型转换

    Java:对象创建和初始化过程 1.Java中的数据类型     Java中有3个数据类型:基本数据类型(在Java中,boolean.byte.short.int.long.char.float.double这八种是基本数据类型).引用类型和null类型.其中,引用类型包括类类型(含数组).接口类型.     下列语句声明了一些变量: int k ; A a; //a是A数据类型的对象变量名. B b1,b2,-,b10000;// 假定B是抽象类或接口. String s; 注意:从数据类型

  • C#引用类型转换的常见方式总结

    本文以实例形式简单讲述了引用类型转换的几种常见方式,如:子类转换成父类,父类转换成子类,以及不是子父级关系类之间的转换.现分述如下,供大家参考: 一.隐式转换:子类转换成父类 public class Animal { public int _age; public Animal(int age) { this._age = age; } } public class Dog : Animal { public float _weight; public Dog(float weight, in

  • 详解解密Java中的类型转换问题

    众所周知Java中的数据类型是强数据类型,基本数据类型之间的转换尤其固定的规则,当数据宽度比较窄的数据类型(如int)转换成数据类型比较宽的数据类型时(如double),则窄的数据类型会加宽,可以完成自动类型转换,这称为隐式转换. 如:以下代码没有任何问题,结果也是正确的,成绩不会发生变化,所不同的是成绩的精度提高了. intintScore = 96; doubledoubleScore = intScore; 那么如果试图把宽的数据类型(如double)转换成窄的数据类型(如float)时,

  • 详解JavaScript中的强制类型转换

    avaScript 原语 JavaScript 建立在一系列基本单元之上.你应该对其中的一些已经很熟悉了,比如字符串和数字: var greet = "Hello"; var year = 89; 字符串和数字是该语言所谓"原语"的一部分.完整清单是: String Number Boolean Null Undefined Object Symbol (ES6中添加,此处不予介绍) 布尔值用来表示可能是真或假的值. null 是故意不去赋值,它通常被分配给一个变量

  • 解决Java中的强制类型转换和二进制表示问题

    1.Java中用补码形式表示 2.第一位正负位,1表示负,0表示正. 3.原码:一个数的二进制表示. 3的原码00000011   -3的 原码 100000114.反码:负数原码按位取反(符号位不变).正数原码本身. 3的反码00000011   -3的反码111111005.补码:正数是原码本身.负数反码加1. 3的补码是00000011  -3的补码是11111101int占4个字节,32位 byte占1个字节,8位 所以强转时会截断.前24位 在内存中表示形式( 注意java中是以补码表

随机推荐