C++转换构造函数
发布时间:2023-06-12 13:19:36 所属栏目:语言 来源:
导读:将其它类型转换为当前类类型需要借助转换构造函数(Conversion constructor)。转换构造函数也是一种构造函数,它遵循构造函数的一般规则。转换构造函数只有一个参数。
仍然以 Complex 类为例,我们为它添加转换构
仍然以 Complex 类为例,我们为它添加转换构
将其它类型转换为当前类类型需要借助转换构造函数(Conversion constructor)。转换构造函数也是一种构造函数,它遵循构造函数的一般规则。转换构造函数只有一个参数。 仍然以 Complex 类为例,我们为它添加转换构造函数: #include <iostream> using namespace std; //复数类 class Complex{ public: Complex(): m_real(0.0), m_imag(0.0){ } Complex(double real, double imag): m_real(real), m_imag(imag){ } Complex(double real): m_real(real), m_imag(0.0){ } //转换构造函数 public: friend ostream & operator<<(ostream &out, Complex &c); //友元函数 private: double m_real; //实部 double m_imag; //虚部 }; //重载>>运算符 ostream & operator<<(ostream &out, Complex &c){ out << c.m_real <<" + "<< c.m_imag <<"i";; return out; } int main(){ Complex a(10.0, 20.0); cout<<a<<endl; a = 25.5; //调用转换构造函数 cout<<a<<endl; return 0; } 运行结果: 10 + 20i 25.5 + 0i Complex(double real);就是转换构造函数,它的作用是将 double 类型的参数 real 转换成 Complex 类的对象,并将 real 作为复数的实部,将 0 作为复数的虚部。这样一来,a = 25.5;整体上的效果相当于: a.Complex(25.5); 将赋值的过程转换成了函数调用的过程。 在进行数学运算、赋值、拷贝等操作时,如果遇到类型不兼容、需要将 double 类型转换为 Complex 类型时,编译器会检索当前的类是否定义了转换构造函数,如果没有定义的话就转换失败,如果定义了的话就调用转换构造函数。 转换构造函数也是构造函数的一种,它除了可以用来将其它类型转换为当前类类型,还可以用来初始化对象,这是构造函数本来的意义。下面创建对象的方式是正确的: Complex c1(26.4); //创建具名对象 Complex c2 = 240.3; //以拷贝的方式初始化对象 Complex(15.9); //创建匿名对象 c1 = Complex(46.9); //创建一个匿名对象并将它赋值给 c1 在以拷贝的方式初始化对象时,编译器先调用转换构造函数,将 240.3 转换为 Complex 类型(创建一个 Complex 类的匿名对象),然后再拷贝给 c2。 如果已经对+运算符进行了重载,使之能进行两个 Complex 类对象的相加,那么下面的语句也是正确的: Complex c1(15.6, 89.9); Complex c2; c2 = c1 + 29.6; cout<<c2<<endl; 在进行加法运算符时,编译器先将 29.6 转换为 Complex 类型(创建一个 Complex 类的匿名对象)再相加。 需要注意的是,为了获得目标类型,编译器会“不择手段”,会综合使用内置的转换规则和用户自定义的转换规则,并且会进行多级类型转换,例如: 编译器会根据内置规则先将 int 转换为 double,再根据用户自定义规则将 double 转换为 Complex(int --> double --> Complex); 编译器会根据内置规则先将 char 转换为 int,再将 int 转换为 double,最后根据用户自定义规则将 double 转换为 Complex(char --> int --> double --> Complex)。 从本例看,只要一个类型能转换为 double 类型,就能转换为 Complex 类型。请看下面的例子: int main(){ Complex c1 = 100; //int --> double --> Complex cout<<c1<<endl; c1 = 'A'; //char --> int --> double --> Complex cout<<c1<<endl; c1 = true; //bool --> int --> double --> Complex cout<<c1<<endl; Complex c2(25.8, 0.7); //假设已经重载了+运算符 c1 = c2 + 'H' + true + 15; //将char、bool、int都转换为Complex类型再运算 cout<<c1<<endl; return 0; } 运行结果: 100 + 0i 65 + 0i 1 + 0i 113.8 + 0.7i (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |