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_cast<float>(a)/b<<endl; //float = int int = float
return 0;
int *p; void *q;
p = static_cast<int*>(q);
char *p = static_cast<char*>(malloc(100));

2.重解释类型转换

1.语法格式

reinterpret_cast<目标类型> (标识符)

2.转化规则

将数据以二进制存在形式的重新解释,在双方向上都不可以隐式类型转换的,则需要重解释类型转换

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
	int x = 0x12345648;
	char *p = reinterpret_cast<char*>(&x);
	//char*p = static_cast<char*>(&x); error
	printf("%x\n",*p);
	int a[5] = {1,2,3,4,5};
	int *q = reinterpret_cast<int*>(a+1);
	printf("%x\n",*q);
	return 0;
}

3.常类型转换

1.语法格式

const_cast<目标类型> (标识符) //目标类类型只能是指针或引用。

2.语法规则

用来移除对象的常量性使用 const_cast 去除 const 限定的,目的不是为了修改它的内容,使用 const_cast 去除 const 限定,通常是为了函数能够接受这个实际参数。

#include <iostream>
using namespace std;
void func(int & ref) //别人己经写好的程序或类库
{
	cout<<ref<<endl;
}
int main(void)
{
	const int m = 1;
	func(const_cast<int&>(m));
	return 0;
}

脱掉const后的引用或指针可以改吗

#include <iostream>
using namespace std;
int main()
{
	const int x = 200;
	int & a =const_cast<int&>(x); // int &a = x;
	a = 300;
	cout<<a<<x<<endl;
	cout<<&a<<"---"<<&x<<endl;
	int *p =const_cast<int*>(&x); // int *p = &x;
	*p = 400;
	cout<<a<<*p<<endl;
	cout<<p<<"---"<<&x<<endl;
	struct A
	{
		int data;
	};
	const A xx = {1111};
	A &a1 = const_cast< A&>(xx);
	a1.data = 222;
	cout<<a1.data<<xx.data<<endl;
	A *p1 = const_cast<A*>(&xx);
	p1->data = 333;
	cout<<p1->data<<xx.data<<endl;
	return 0;
}

结论:可以改变 const 自定义类的成员变量,但是对于内置数据类型,却表现未定义行为

3.const 常变量(补充)

C++中 const 定义的变量称为常变量。变量的形式,常量的作用,用作常量,常用于取代#define 宏常量

4.动态类型转换

1.语法格式

dynamic_cast<目标类型> (标识符)

用于多态中的父子类之间的强制转化

总结

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

(0)

相关推荐

  • C++双目运算符+=的重载详解

    目录 1.+=重载 2.friend重载+= 3.运算符 3.1 单目运算符 3.2 双目运算符 3.3 三目运算符 4.重载++和重载- - 总结 1.+=重载 class Complex { public: Complex(int a, int b) : _a(a) , _b(b) {} Complex& operator+= (Complex& other) { this->_a += other._a; this->_b += other._b; return *thi

  • C++运算符重载图文详解

    目录 1. 运算符重载 1.1 运算符重载为普通函数 1.2 运算符重载为成员函数 2. 赋值运算符=的重载 2.1浅复制与深复制 2.2返回值的讨论 3. 动态可变长度数组 总结 1. 运算符重载 C++的运算符只能用于基本的数据类型 表达形式 返回值类型 operator 运算符 (形参表) { ... } 1.1 运算符重载为普通函数 1.2 运算符重载为成员函数 2. 赋值运算符=的重载 当赋值运算符两边的类型不匹配,比如int类型赋值给Complex类型,在这种情况下,就需要重载赋值运

  • C++中运算符重载详解及其作用介绍

    目录 概述 函数重载 运算符重载 C++ 的运算符 重载运算符的规则 成员函数实现 Complex 加法 运算符重载的方法 多种实现方法 实现 operator+= 三种运算符重载函数 成员函数实现 友元函数实现 输出结果 重载单元运算符 例子 重载二元运算符 例子 重载 I/O 插入运算符 << 提取运算符 >> 总结 概述 运算符重载 (Operator Overloading) 函数重载 重载: 将同一名字重新赋予新的含义. 函数重载: 对一个函数赋予新的含义, 使之实现新功

  • 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++11运算符重载和向量类重载实例详解(<<,>>,+,-,*等)

    目录 1. C++运算符重载介绍 1.1 单目运算符与双目运算符 1.2 友元运算符 2. 实例讲解 2.1 头文件定义 2.2 实现运算符重载 总结 1. C++运算符重载介绍 C ++ 中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作.这时就必须在C ++ 中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作.运算符重载的实质是函数重载,它提供了C ++ 的可扩展性,也是C ++ 最吸引人的特性之一.

  • C++类与对象之运算符重载详解

    目录 运算符重载 加号运算符重载 左移运算符重载 递增运算符重载 递减运算符重载 赋值运算符重载 关系运算符重载 函数调用运算符重载 总结 运算符重载 运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 加号运算符重载 作用:实现两个自定义数据类型相加的运算 #include <iostream> using namespace std; class Person { public: // 构造函数 Person(int num1, int num2){ thi

  • 一篇文章带你了解c++运算符重载

    目录 友元函数 重载:复合赋值 Operator pairings 自增自减运算符的重载 c++20,spaceship operator 总结 友元函数 一种全局函数,可以在类里声明,其他地方定义.或者在类里定义生命. 但是这个友元函数,不是类的成员.用的时候直接用,但是可以接触类的所有权限的变量. 对于,重载操作符来说,可以把一些重载体函数定义为友元函数. 具体来说,如果进行运算的这两个类,是对等的,没有修改任一个的值,那么,建议用友元. 如果,类似=,是赋值,对左边的变量做修改了.那么这时

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

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

  • C++算术运算符与类型转换

    目录 1.算术运算符 2.优先级 3.类型转换 初始化和赋值时的转换 使用花括号进行转换 4.表达式中转换 5.强制类型转换 1.算术运算符 C++当中提供5种基础的算术运算符:加法.减法.乘法.除法和取模. 我们来看下代码: int a = 10, b = 3; cout << a + b << endl; // 13 cout << a - b << endl; // 7 cout << a * b << endl; // 30

  • JAVA中string数据类型转换详解

    在JAVA中string是final类,提供字符串不可以修改,string类型在项目中经常使用,下面给大家介绍比较常用的string数据类型转换: String数据类型转换成long.int.double.float.boolean.char等七种数据类型 复制代码 代码如下: * 数据类型转换 * @author Administrator * */ public class 数据类型转换 { public static void main(String[] args) { String c=

  • 有关C++继承与友元、继承与类型转换详解

    实例如下: #include <iostream> using namespace std; class a{ friend class pal; private: int i; protected: int j; public: int k; }; class b:public a{ protected: int l; }; class c:protected a{}; class d:private a{}; class e:public b{}; class pal{ public: v

  • JavaScript显式数据类型转换详解

    基本概念 将值从一种类型转换为另一种类型称为类型转换,类型转换总是返回基本类型值,如字符串.数字和布尔值,不会返回引用类型值. 类型转换分为"显式"和"隐式":"显式"转换发生在静态类型语言的编译阶段,而"隐式"转换则发生在动态类型语言的运行时. 显式类型转换 非字符串到字符串的类型转换 toString() 方法 数字.布尔值.字符串和对象都有 toString() 方法,但 null 和 undefined 没有. 例子:

  • Java之int和string类型转换详解

    int.String的类型转换 int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=String.valueOf(i); 这两种方法有什么区别呢?作用是不是一样的呢?是不是在任何下都能互换呢? String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法:i=Integer.valueOf(s

  • C/C++中数据类型转换详解及其作用介绍

    目录 概述 不同类型数据间的转换 隐式类型转换 强制类型转换 自己声明的类型转换 转换构造函数 类型转换函数 案例 应用 概述 在日常的开发中, 我们经常会用到数据类型转换, 所以我们要对数据类型转换有一定的了解. 不同类型数据间的转换 在 C++ 中, 某些标准类型的数据之间可以自动转换. 隐式类型转换 隐式类型转换: 由 C++ 编译系统自动完成的, 我们无需干预. 例如: int main() { int a = 6; a = a + 3.5; cout << a << en

  • Python教程之类型转换详解

    目录 隐式类型转换 显式类型转换 Python 定义了类型转换函数以将一种数据类型直接转换为另一种数据类型,这在日常和竞争性编程中很有用.本文旨在提供有关某些转换函数的信息. Python中有两种类型转换: 隐式类型转换 显式类型转换 让我们详细讨论它们. 隐式类型转换 在 Python 中数据类型的隐式类型转换中,Python 解释器会自动将一种数据类型转换为另一种数据类型,而无需任何用户参与.要更清楚地了解该主题,请参阅以下示例. 例子: x = 10 print("x is of type

  • Java数据类型转换详解

    一.基本数据类型阐述 Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. [注]JAVA没有unsigned类型 (1). 整数:int,short,byte,long (2). 浮点型:float,double (3). 字符:char (4). 布尔:boolean 基本型别     大小         最小值            最大值 void boolean     -----         -----             

  • 关于Struts2的类型转换详解

    一.类型转换的意义 对于一个智能的MVC框架而言,不可避免的需要实现类型转换.因为B/S(浏览器/服务器)结构应用的请求参数是通过浏览器发送到服务器的,这些参数不可能有丰富的数据类型,因此必须在服务器端完成数据类型的转换 MVC框架是一个表现层解决方案,理应提供类型转换的支持,Struts2提供了功能非常强大的类型转换支持. 二.表现层数据的处理 1.对于web应用而言,表现层主要用于与用户交互,包括收集用户输入数据,向用户呈现服务器的状态.因此表现层的数据的流向主要有两个方向:输入数据和输出数

  • C#用户定义类型转换详解

    C#用户定义类型转换 •用于自定义类和结构能够进行隐式转换和显示转换.例如:将一个自定义类类型转换成整型,浮点型等,反之亦然. C#提供隐式转换和显式转换 •隐式转换:编译器自动执行转换•显式转换:编译器只在使用显式转换运算符时才执行转换声明隐式转换的语法如下.注:所有用户定义转换必须使用public和static修饰符 复制代码 代码如下: public static implicit operator TargetType(SourceType Identifier){       ... 

随机推荐