zoukankan      html  css  js  c++  java
  • c/c++ 重载运算符 类型转换运算符

    重载运算符 类型转换运算符

    问题:能不能把一个类型A的对象a,转换成另一个类型B的对象b呢??

    是可以的。这就必须要用类型A的类型转换运算符(conversion operator)

    下面的operator int()const{return val;}就是重载了的类型Int的类型转换运算符

    class Int{
    public:
      Int(int i = 0) : val(i){}
      explicit operator int()const{return val;}
    private:
      int val;
    };
    

    注意:加了explicit的类型转换运算符,就不能隐式的转化,必须显式转化,也就是下面的形式:

    Int ii(10);
    int i = (int)ii;
    

    如果不加explicit,就是下面的形式:

    Int ii(10);
    int i = ii;
    

    问题:类A里定义了可以转换成类B的类型转化运算符,类B里定义了参数为类A的构造函数(也就是转换构造函数,当要把类A的对象转换成类B的对象时,是调用类A的类型转化运算符呢,还是调用类B的构造函数呢??

    从下面的例子看,调用的是类A的构造函数

    例子:

    #include <iostream>
    
    /*---------test1------------- */
    class Int{
    public:
      Int(int i = 0) : val(i){}
      explicit operator int()const{return val;}
    private:
      int val;
    };
    /*---------test1------------- */
    
    /*---------test2------------- */
    struct A;
    struct B{
      operator A()const;
      int val;
    };
    
    struct A{
      A(int i = 0) : val(i){}
      A(const B& b){
        std::cout << "A copy" << std::endl;
        val = b.val;
      }
    private:
      int val;
    };
    
    B::operator A()const{
      std::cout << "B cast" << std::endl;
      return A(10);
    }
      A f(const A&){}
    /*---------test2------------- */
    int main(){
    /*---------test1------------- */
      Int i1;
      i1 = 10;
      int s = (int)i1 + 11;
      std::cout << s << std::endl;
    
      const Int i2(11);
      int s1 = (int)i2;
    /*---------test1------------- */
    
    /*---------test2------------- */
      B b1;
      A a1 = f(b1);//编译应该不知道应该调用谁,但是从执行结果来看,是调用了类A的构造函数
      //A a1 = f(b1.operator A());//告诉编译器调用类B类型转化运算符
      //A a1 = f(A(b1));//告诉编译器调用类A的构造函数
    /*---------test2------------- */
    }
    
    

    github

    c/c++ 学习互助QQ群:877684253

    本人微信:xiaoshitou5854

  • 相关阅读:
    【转】fastjson-1.2.47-RCE
    某安全设备未授权访问+任意文件下载0day
    关于伴侣
    【转】Why BIOS loads MBR into 0x7C00 in x86 ?
    【生活】北京旅游攻略
    利用Python读取图片exif敏感信息
    A MacFUSE-Based Process File System for Mac OS X
    linux-强制断开远程tcp连接
    Navicat use HTTP Tunnel
    python mac下使用多进程报错解决办法
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/10180771.html
Copyright © 2011-2022 走看看