类型转换(C++学习笔记 37)

本文详细介绍了C++中的类型转换,包括系统预定义类型间的隐式转换,如算数转换、数组转指针、指针转换、布尔转换和常量转换,以及显式转换。此外,还探讨了类类型与系统预定义类型间的转换,通过转换构造函数和类型转换函数实现。各种转换构造函数和类型转换函数的应用示例加深了理解。
摘要由CSDN通过智能技术生成

一、系统预定义类型间的转换

对于系统预定义的标准类型(int、float、double、char等),C++提供两种类型转换方式:隐式类型转换显式类型转换

1、隐式类型转换

C++语言不会直接将两个不同类型的值相加,而是先根据类型转换规则设法将运算对象的类型统一后再求值,隐式转换(implicit conversion) 的类型转换是自动执行的,无需程序员的介入。

在赋值表达式A=B的情况下,赋值运算符右端B的值需转换为A类型后进行赋值。
例如:

int x=5,y;
y=3.5+x;

在进行“3.5+x”时,先将x的值5转换成double类型,然后与3.5相加,得到的和为8.5,在向整形变量y赋值时,将8.5转换成整数8,然后赋给y。这种转换是由C++编译系统自动完成的。

(1)算数转换

大量的例子:

bool flag;
short sval;
int ival;
long lval;
float fval;
char cval;
unsignedshort usval;
unsigned int uival;
unsigned long ulval;
double dval;
3.14159L + 'a';  //'a'提升成 int,然后该int 值转换成long double
dval + ival;  //ival转换成 double
dval + fval;  //fval转换成 double
ival = dval;  //dval转换成(切除小数部分后)int
flag = dval;  //如果dval是0,则flag 是flase,否则flag 是 true
cval + fval;  //cval 提升成 int ,然后该 int 值转换为 float
sval + cval;  //sval 和 cval 都提升成 int
cval + lval;  //cval 转换成 long
ival + ulval;  //ival 转换成 unsigned long
usval + ival;  //根据unsigned short 和 int 所占空间的大小进行提升
uival + lval;  //根据unsigned int 和 long 所占空间的大小进行转换
(1)数组转换成指针

在大多数用到数组的表达式中,数组自动转换成指向数组首元素的指针。

int ia[10];  //含有10个整数的数组
int* ip = ia;  //ia转换成指向数组首元素的指针
(2)指针的转换

C++规定了几种指针转换方式:

  • 常量整数值 0 或字面值 nullptr 能转换成任意指针类型;
  • 指向任意非常量的指针能转换成 void* ;
  • 指向任意对象的指针能转换成 const void*;
  • 在有继承关系的类型间还有另外一种指针转换的方式。
(3)转换成布尔类型

存在一种从算数类型或指针类型向布尔类型自动转换的机制,如果指针或算数类型的值为0,转换结果是false;否则转换结果是 true。

char *cp = get_string();
if(cp)    //如果指针cp不是0,条件为真
while(*cp)   //如果*cp不是空字符,条件为真
(4)转换成常量

允许将 指向非常量类型的指针 转换成 指向相应的常量类型的指针 。对于引用也是这样。即,如果T是一种类型,我们就能将指向 T 的指针或引用分别转换成指向 const T 的指针或引用。

int i;
const int &j  = i;	//非常量转换成 const int 的引用
const int *p = &i;	//非常量的地址转换成const的地址
int &r = j,*q = p;   //错误,不允许const转换成非常量
(5)类类型定义的转换

类类型能定义由编译器自动执行的转换,不过编译器每次只能执行一种类类型的转换。

class Test1
{
   
	public:
		Test1(int n) {
    num = n; } //普通构造函数
	private:
		int num;
};
class Test2
{
   
	public:
		explicit Test2(int n) {
   
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值