不同类型数据间的转换----c++对c的扩充(9)

标准类的转换有两种:
< 一 > 隐式类型转换

在这里插入图片描述
此段代码的处理过程:首先将int类型的i转化为double类型,与2.3运算,然后再将结果,转化为int类型。此过程使由c++编译系统自动完成的,用户不需要干扰。

< 二 >显示类型转换
程序员将指定的的数据转换为另一种指定的类型;
如下图所示:
在这里插入图片描述
ps:c语言中也有类型转换,不过圆括号是在数据类型两侧的:
c++保留了这种写法,不过还是提倡采用c++的写法,也就是上图所示。
在这里插入图片描述
—————————————————————————————————
除了标准类的转换,自定义的类也可进行类型转换,可以将自定义的类转换为标准类,也可以将自定义的类转化为其他的类。

转换构造函数进行不同类型数据的转换
用途:
将一个数据类型转换为另一个类。

complex (double r){//将一个数据类型转化为一个类的对象
	real = r;
	imag = 0;
}

应用:

complex (double r){
	real = r;
	imag = 0;
}
int main(){
	complex z1;
	complex z = z1+complex(2.3);//若写成 z = z1+2.3则错误
	c2 = complex(2.1)
}

这个应用形式与int()很相似,可以认为是complex(2.3)的作用是强制类型装换,将2.3转换为complex类对象。

特点:

  • 转换构造函数只有一个参数。
  • 一个类体中可以有转换构造函数,也可以没有。
  • 转换构造函数也是一个构造函数,遵循构造函数的一般规则。
  • 通常把有一个参数的构造函数用作类型转换,但也不是所有,也可以不做类型转换
  • 类型转换构造函数,必须只有一个参数,如果有多个参数则不是转换构造函数。
  • 类型转换构造函数必须是在一个类中定义的。

ps:
当然不只是可以将一个标准类型数据转换为类对象,也可以将一个类的对象转换为构造函数所在的类对象。
例子:

teacher(student &x){
	num = x.num;
	strcmp(name,x.name);
	sex = x.sex;//前提是,num name 以及sex都是共用成员否则无法被其他类引用。
}

类型转换函数
用途:将一个类的对象,转换为另一个类型的数据。
应用:

operator double (){
//函数名为:operator double(对象类型 ->double类型)
	return real;//返回的值是double类型的real值
	//作用是:将一个complex类型的对象转换为一个double类型的数据
}

特点:

  • 类型转换函数是没有返回类型的,与运算符重载函数一致
  • 类型转换函数只能是作为成员函数,因为转换的主体是本类的对象
  • 可以理解为将double类型进行了重载,在原来的意义上多了一层定义:也就是将一个complex类对象转换为double类型数据,并指定转换方法。
  • 程序中不需要显示地调用类型转换函数,它是自动被调用的(隐式调用)。
    在这里插入图片描述
    优点:
    不需要经常性的重载运算符,可以通过进行数据转换,太调整,从而可以直接使用没有被重载过的运算符。

目前问题:同时使用类型转换函数和转换构造函数以及运算符重载函数时,会报错,具体哪里出问题,还不清楚。

# include <iostream>
using namespace std;
class complex {
public :
	complex() {
		real = 0;
		imag = 0;
	}
	complex(double r, double i) {
		real = r;
		imag = i;
	}
	//类型转换函数
	operator double() {
		return real;
	}
	//转换构造函数
	complex(double x) {
		real = x;
		imag = 0;
	}
	friend complex operator+(const complex& z, const complex& z3);
		
private:
	double real;
	double imag;
};
 complex operator+(const complex& z, const complex& z3) {
	complex z1;
	z1.real = z.real + z3.real;
	z1.imag = z.imag + z3.imag;
	return z1;

}
int main() {
	complex x1(1,1), x2;
	double x = x1 + 3;//报错
	cout << x;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值