标准类的转换有两种:
< 一 > 隐式类型转换
此段代码的处理过程:首先将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;
}