首页 > 代码库 > C++语言基础(22)-转换构造函数和类型转换函数

C++语言基础(22)-转换构造函数和类型转换函数

一.转换构造函数

将其它类型转换为当前类类型需要借助转换构造函数(Conversion constructor)。转换构造函数也是一种构造函数,它遵循构造函数的一般规则。转换构造函数只有一个参数。

#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

二.类型转换函数

#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){ }public:    friend ostream & operator<<(ostream &out, Complex &c);    friend Complex operator+(const Complex &c1, const Complex &c2);    operator double() const { return m_real; }  //类型转换函数private:    double m_real;  //实部    double m_imag;  //虚部};//重载>>运算符ostream & operator<<(ostream &out, Complex &c){    out << c.m_real <<" + "<< c.m_imag <<"i";;    return out;}//重载+运算符Complex operator+(const Complex &c1, const Complex &c2){    Complex c;    c.m_real = c1.m_real + c2.m_real;    c.m_imag = c1.m_imag + c2.m_imag;    return c;}int main(){    Complex c1(24.6, 100);    double f = c1;  //相当于 double f = Complex::operator double(&c1);    cout<<"f = "<<f<<endl;     f = 12.5 + c1 + 6;  //相当于 f = 12.5 + Complex::operator double(&c1) + 6;    cout<<"f = "<<f<<endl;     int n = Complex(43.2, 9.3);  //先转换为 double,再转换为 int    cout<<"n = "<<n<<endl;    return 0;}

运行结果:

f = 24.6
f = 43.1
n = 43

注意:最好不要同时使用转换构造函数和类型转换函数,因为这样会导致语义的二义性。

 

C++语言基础(22)-转换构造函数和类型转换函数