类型转换函数,转换构造函数与运算符的重载

转换构造函数:将其他类型的数据转换成类的对象

类型转换函数:将一个类的对象转换成其他类型的数据

1 举例分析

假设已经定义的d1,d2为double型变量,c1,c2为Complex类对象,如果类中还定义了类型转换函数

以下表达式

d1=d2+c1;

+的左边是double类型,右边是Compplex类型

(1)先检查是否有运算符重载,(么有)

(2)先检查有无类型转换函数(有)

所以将comlex类型数据转换成double最后赋值给d1;

假如定义了运算符的重载(俩个complex而没有对double进行重载)和转换构造函数,但没有定义类型转换函数

系统会使用转换构造函数将double类型转换成complex类

2 使用类型转换函数将double类型数据与complex数据相加(已知两个double 的数据可以直接相加)

#include <iostream> 
using namespace std;
class Complex//定义一个复数类 
{
    private :
    int imag;
    int real;//私有数据实部虚部
    public:
    Complex() {real=0;imag=0 ;};//默认构造函数初始化
    Complex(int a,int b) 
    {
        real=a;
        imag=b;//有参数的构造函数初始化 
    }
    operator double() 
    {
        return real;//定义类型转换函数 
    }
     
};
int main() 
{
    Complex c1(3,4), Complex c2(3,5),Complex c3;//定义对象
    double d;
    d=3.5+c1;
    cout<<d<<endl;
    return 0; 
}

分析

假如没有类型转换函数,系统是会报错的因为complex的数据类型不能和double的数据类型直接相加

假如定义重载函数可以使得两个复数类型相加

(1) c3=c2+c1;//是可以正常运行的

假如有如下

(2)d=c1+c2;//等号右边是可以直接相加得到复数类型的,等号左边是复数类型,但是又有类型转换函数所以可以将相加后的数据转换成double赋值给左侧;

3 包含运算符承载函数和类型转换函数的程序

#include <iostream>
using namespace std;
class Complex
{
    private :
        double imag;
        double real;
        public :
            Complex(){ real=0;
            imag=0;
            }
            Complex(double a,double b) {
                real=a;
                imag=b;
            }
        Complex(double r)     { real=r;
        imag=0;
        }   //转换构造函数
        void display();
        friend Complex operator +(Complex c1,Complex c2) ;//声明为友元函数的运算符重载                                                                               
};
void Complex::display()
{
    cout<<"real="<<real<<","<<"imag="<<imag<<endl;
}
Complex operator+(Complex c1,Complex c2)
{
    return Complex(c1.real+c2.real,c1.imag+c2.imag);
}
int main()
{
    Complex c1(3,4),c2(4,5),c3;
    c3=c1+2.3;
    c3.display();
    return 0;
    
}

如果没有定义转换构造函数,系统编译会出错,因为没有重载complex和double的数据相加,此过程中,系统先调用转换构造函数然后在运行

注意;在已经定义转换构造函数的情况下+重载为友元函数可以进行交换律但是若为成员函数则是不可以的

假如一定要重载为成员函数的同时实现交换律,只有一个办法可以解决,就是再重载一个+函数,但是函数必须为友元函数    

若在上述程序中增加类型转换函数

operator double(){return real;}

程序在运行的时候会出错,原因是出现了二义性,一种方法是调用转换构造函数把2.3变成complex对象再调用重载+,另一种理解是把c1转换成double类型然后相加系统无法判定,这两者是矛盾的

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值