C++运算符重载补充之不同数据间的类型转换
2011-08-14 11:32
399 查看
我们在使用重载的运算符时,往往需要在自定义数据类型和系统预定义的数据类型之间进行转换,或者需要在不同的自定义数据类型之间进行转换。今天就来讲讲C++中数据类型的转换。
1.对于系统的预定义基本类型数据,C++提供了两种类型转换方式:隐式类型转换和显式类型转换。
上述代码中的(1)就是含有隐式类型转换的表达式,在进行"a+b"时,编译系统先将a的值5转换为双精度double,然后和b相加得到10.55,在向整形变量sum赋值时,将10.55转换为整形数10,赋值为变量sum。这种转换是C++编译系统自动完成,不需要用户去干预。而上例中的(2)和(3)中则涉及到了显式类型转换,它们都是把a+b所得结果的值,强制转化为整形数。只是(2)式是C语言中用到的形式:(类型名)表达式,而(3)式是C++中的采用的形式:类型名(表达式);
2.那么对于用户自定义的类类型而言,有该如何去实现它们和其他数据类型之间的转换呢,C++中提供了来那个中方法:(1)通过转换构造函数进行类型转换;(2)通过类型转换函数进行类型转换;
毫无疑问转换构造函数就是构造函数的一种,只不过它拥有类型转换的作用罢了。是否记得在C++之运算重载符(1)中两个复数(sum=com1+com2)相加的实例,现在如果我想要实现sum=com1+5.5,那该怎么办,也许你首先会想到再定义一个关于复数加双精度的运算符重载函数。这样做的确可以。另外我们还可以定义一个转换构造函数来解决上述的问题。我们对Comlex类(复数类)进行这样改造:
结果:
上述代码在执行Complex(5.5)时,调用了转换构造函数,将double类型的5.5转换为无名的Complex类的临时对象(5.5+0i),然后执行两个Complex类(复数类)对象相加的运算符重载函数。所以说一般的转换构造函数的定义形式:
类名(待转换类型)
{
函数体;
}
转换构造函数不仅可以将预定义的数据类型转换为自定义类的对象,也可以将另一个类的对象转换成转换构造函数所在的类的对象。
转换构造函数可以把预定义类型转化为自定义类的对象,但是却不能把类的对象转换为基本数据类型。比如:不能将Complex类(复数类)的对象转换成double类型数据。于是在C++中就用类型转换函数来解决这个问题。定义类型转换函数一般形式:
operator 目标类型()
{
...
return 目标类型的数据;
}
目标类型是所要转化成的类型名,既可以是预定义及基本类型也可以是自定义类型。类型转换函数的函数名(operator 目标类型)前不能指定返回类型,且没有参数。但在函数体最后一条语句一般为return语句,返回的是目标类型的数据。现在我们对Complex类做类似改造:
结果:
3.最后对类型转换函数做几点补充:(1)类型转换函数只能作为类的成员函数,不能定义为类的友元函数;(2)类型转换函数中必须有return语句,即必须送回目标类型的数据作为函数返回值;(3)一个类可以定义多个类型转换函数,C++编译器会根据函数名来自动调用相应的类型转换函数函数;
1.对于系统的预定义基本类型数据,C++提供了两种类型转换方式:隐式类型转换和显式类型转换。
int a=5,sum; double b=5.55; sum=a+b;//-------(1) std::cout<<"隐式转换:a+b="<<sum<<std::endl; sum=(int)(a+b);//-------(2) sum=int(a+b);//-------(3) std::cout<<"显式转换:a+b="<<sum<<std::endl;
上述代码中的(1)就是含有隐式类型转换的表达式,在进行"a+b"时,编译系统先将a的值5转换为双精度double,然后和b相加得到10.55,在向整形变量sum赋值时,将10.55转换为整形数10,赋值为变量sum。这种转换是C++编译系统自动完成,不需要用户去干预。而上例中的(2)和(3)中则涉及到了显式类型转换,它们都是把a+b所得结果的值,强制转化为整形数。只是(2)式是C语言中用到的形式:(类型名)表达式,而(3)式是C++中的采用的形式:类型名(表达式);
2.那么对于用户自定义的类类型而言,有该如何去实现它们和其他数据类型之间的转换呢,C++中提供了来那个中方法:(1)通过转换构造函数进行类型转换;(2)通过类型转换函数进行类型转换;
毫无疑问转换构造函数就是构造函数的一种,只不过它拥有类型转换的作用罢了。是否记得在C++之运算重载符(1)中两个复数(sum=com1+com2)相加的实例,现在如果我想要实现sum=com1+5.5,那该怎么办,也许你首先会想到再定义一个关于复数加双精度的运算符重载函数。这样做的确可以。另外我们还可以定义一个转换构造函数来解决上述的问题。我们对Comlex类(复数类)进行这样改造:
#include "stdafx.h" #include <iostream> class Complex //复数类 { private://私有 double real;//实数 double imag;//虚数 public: Complex(double real,double imag) { this->real=real; this->imag=imag; } Complex(double d=0.0)//转换构造函数 { real=d;//实数取double类型的值 imag=0;//虚数取0 } Complex operator+(Complex com1);//或friend Complex operator+(Complex com1,Complex com2); void showComplex(); }; Complex Complex::operator+(Complex com1) { return Complex(real+com1.real,imag+com1.imag); } void Complex::showComplex() { std::cout<<real; if(imag>0) std::cout<<"+"; if(imag!=0) std::cout<<imag<<"i"<<std::endl; } int main() { Complex com(10,10),sum; sum=com+Complex(5.5);//Complex(5.5)把双精度数5.5转换为复数5.5+0i sum.showComplex();//输出运算结果 return0; }
结果:
上述代码在执行Complex(5.5)时,调用了转换构造函数,将double类型的5.5转换为无名的Complex类的临时对象(5.5+0i),然后执行两个Complex类(复数类)对象相加的运算符重载函数。所以说一般的转换构造函数的定义形式:
类名(待转换类型)
{
函数体;
}
转换构造函数不仅可以将预定义的数据类型转换为自定义类的对象,也可以将另一个类的对象转换成转换构造函数所在的类的对象。
转换构造函数可以把预定义类型转化为自定义类的对象,但是却不能把类的对象转换为基本数据类型。比如:不能将Complex类(复数类)的对象转换成double类型数据。于是在C++中就用类型转换函数来解决这个问题。定义类型转换函数一般形式:
operator 目标类型()
{
...
return 目标类型的数据;
}
目标类型是所要转化成的类型名,既可以是预定义及基本类型也可以是自定义类型。类型转换函数的函数名(operator 目标类型)前不能指定返回类型,且没有参数。但在函数体最后一条语句一般为return语句,返回的是目标类型的数据。现在我们对Complex类做类似改造:
#include "stdafx.h" #include <iostream> class Complex //复数类 { private://私有 double real;//实数 double imag;//虚数 public: Complex(double real,double imag) { this->real=real; this->imag=imag; } Complex(double d=0.0)//转换构造函数 { real=d;//实数取double类型的值 imag=0;//虚数取0 } Complex operator+(Complex com1);//或friend Complex operator+(Complex com1,Complex com2); operatordouble();//声明类型转换函数 void showComplex(); }; Complex Complex::operator+(Complex com1) { return Complex(real+com1.real,imag+com1.imag); } Complex::operatordouble()//定义类型转换函数 { return real;//返回实数部分 } void Complex::showComplex() { std::cout<<real; if(imag>0) std::cout<<"+"; if(imag!=0) std::cout<<imag<<"i"<<std::endl; } int main() { Complex com(10,10),sum; sum=com+Complex(5.5);//Complex(5.5)把双精度数5.5转换为复数5.5+0i sum.showComplex();//输出运算结果 double total; total=double(com)+5.5;//double(com)把复数(10+10i)转换为双精度数10.0 std::cout<<"把Complex类对象转化为double类型与5.5相加为:"<<total; return0; }
结果:
3.最后对类型转换函数做几点补充:(1)类型转换函数只能作为类的成员函数,不能定义为类的友元函数;(2)类型转换函数中必须有return语句,即必须送回目标类型的数据作为函数返回值;(3)一个类可以定义多个类型转换函数,C++编译器会根据函数名来自动调用相应的类型转换函数函数;
相关文章推荐
- C++运算符重载补充之不同数据间的类型转换
- C++运算符重载补充之不同数据间的类型转换
- C++运算符重载补充之不同数据间的类型转换
- C++运算符重载补充之不同数据间的类型转换
- C++运算符重载补充之不同数据间的类型转换
- C++运算符重载补充之不同数据间的类型转换
- c/vc/c++不同数据类型之间的转换
- 【一天一篇CPP】不同类型数据间的转换【转换构造函数、类型转换函数】
- 关于数据类型转换的补充知识
- Qt不同数据类型之间的转换
- 不同数据类型转换
- objective-c中不同数据类型之间的相互转换
- 【JS基础】类型转换——不同数据类型比较
- 不同数据类型与Json之间的转换
- objective c 不同数据类型转换
- JAVA中数据的读取与写入,不同类型数据的转换
- C语言中不同数据类型间混合运算的转换规则
- 不同类型数据间的转换
- JavaScript不同数据类型的转换
- C/C++开发语言系列之16---C++不同类型数据间的转换