欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c/c++ 重载运算符 类型转换运算符

程序员文章站 2022-11-08 21:02:21
重载运算符 类型转换运算符 问题:能不能把一个类型A的对象a,转换成另一个类型B的对象b呢?? 是可以的。这就必须要用类型A的类型转换运算符(conversion operator) 下面的operator int()const{return val;}就是重载了的类型Int的类型转换运算符 注意: ......

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

问题:能不能把一个类型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------------- */
}

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

c/c++ 重载运算符 类型转换运算符

本人微信:xiaoshitou5854