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

posted @ 2018-12-26 18:03  小石王  阅读(768)  评论(0编辑  收藏  举报