C++类的操作符重载&类型转换

这里总结一下C++里面类的操作符的重载以及类型转换的定义,作为对C++ Primer Plus第11章的总结。

操作符重载

通过操作符重载,可以直接定义两个类型之间的操作符(加减乘除等)。一个例子是:

class Vector{
    int x;
    int y;
    Vector (int x, int y);
    Vector operator+(const Vector &v){
        return Vector(this->x+v.x, this->y+v.y);
    }
};
Vector a,b;
Vector c = a+b; // 在Vector上使用加法运算符

操作符重载有两种实现方式:成员函数和非成员函数。

成员函数操作符重载

将操作符重载函数作为类的成员声明并定义,如上面的例子,对于两个Vector的加法,会被解释为:a.operator+(b);
如果操作符是个单目运算符,那么可以在成员函数定义中直接把参数表不写。例如:
Vector operator!();

非成员函数操作符重载

成员函数操作符重载方法有一个显著的缺点:假设操作符是一个二元运算符,操作符左边的值是一个基本类型,那么这种方法就无法定义需要的操作符重载。例如:

class Vector{...};
int integer;
Vector a;
Vector c = integer + a; // 

这时候,可以考虑通过非成员函数的形式定义运算符重载。上面的需求可以这么定义:
Vector operator+(int integer, const Vector &vec);
这么定义有可能会用到Vector类内的一些私有变量,然而,由于不是成员函数,这个重载后的函数是不能访问私有变量的。解决方式是使用友元函数,将该函数设置为Vector类的友元即可。

二义性问题

定义重载运算符,一个需要注意的问题是二义性。例如,同时定义以下两个函数会造成二义性:

Vector Vector::operator+(const Vector &a);
Vector operator+(const Vector &a, const Vector &b);

在这种定义下,Vector v = Vector()+Vector(); 语句会出现二义性,即两个定义的函数都同等程度适用于这个语句,导致编译无法通过。因此,在定义运算符重载的时候务必注意这一点。By the way,加上下面类型转换后,这个问题会变得更加复杂化。

类型转换

C++本身支持一些自动类型转换。例如:int c = 6.0 会自动将double型的6.0转换为int,并赋值给c。但是,对于用户自己定义的类,编译器并不知道如何转换。这时候,就需要自己定义转换构造函数/转换函数了。

转换构造函数

顾名思义,是一种构造函数。他的特点是,只有一个参数。下面给一个例子:

Vector(int a){
    this->x = a;
}
Vector c = 4; // c=(4,0)

这种语法实现了类似将int型的4自动转换为Vector的需求。在调用参数为Vector的函数的时候,如果传入的参数是int型,也会被自动转换成Vector型的变量传进函数内。除此之外,还有以下几种隐式转换:

  • 初始化的时候
  • 对象赋值的时候
  • 函数传参数的时候
  • 返回值和返回类型不一致的时候
  • 在以上情况中,使用可以转换为该类型(这里是int)的其他基本类型的时候

当然,有时候这样做会使得类型转换变得混乱。如果想要关闭某个转换构造函数的自动隐式类型转换,只需要在函数原型前加explicit就行了。在这种情况下,只有通过Vector c = Vector(5) 这种显式转换的方法实现类型转换。

转换函数

可以看做是转换构造函数的反函数。未完待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值