zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    实验 1:Mininet 源码安装和可视化拓扑工具
    Linux bond 网卡主备模式配置
    git常用命令总结
    框架搭建之--配置去除用户输入两边的空格
    性能优化之--数据库缓存
    性能优化之缓存--文件缓存
    网站优化之缓存--页面缓存
    网站优化之缓存--session和cache以及常用缓存应用之间的区别
    MVC请求管道详细总结梳理。
    sql优化记录
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/7123124.html
Copyright © 2011-2022 走看看