运算符重载

本文介绍了C++中的运算符重载,允许用户自定义对象使用标准运算符,提高代码的可读性。通过在类内或利用友元函数实现,如Stock类的+运算符重载。但要注意重载不能改变运算符原有的语法规则和优先级,且不能创建新运算符。此外,某些运算符如赋值运算符只能在类内重载。
摘要由CSDN通过智能技术生成

运算符重载

提出背景

C++中的基本类型可以使用+,-等运算符对其直接进行操作,这样非常方便。但是默认情况下不能直接用运算符对对象进行操作。例如:

class Stock{
    private:
        double price;
    public:
        Stock(double);
        Stock();
};

对于这个类的对象,如果我们想将两个对象的price成员的值相加,就只能定义一个sum()函数来实现操作。这样我们在使用的时候也要调用这个函数。注意运算符的左侧为调用对象,右边是被调用的对象

但是通过重载运算符,我们可以直接将这个操作用操作符来表示,例如:

Stock s1(23);
Stock s2(34);
Stock s = s1 + s2;

这样可以使代码更加整洁优雅。

基本语法

运算符的重载有两种实现方法,一种是在类内实现,另一种是在类外通过友元的方式实现。

在类内实现的格式为:

returnType operatorop (argumentList)

其中op就是需要重载的运算符,在实际应用中的实例为:

class Stock{
    private:
        double price;
    public:
        Stock(double);
        Stock();
        Stock operator+(Stock s) const;
};
Stock Stock::operator+(Stock s) const{
    return Stock(price + s.price);
}

这样就能直接用+运算符对Stock类进行运算,如:

Stock x = Stock(23);
Stock y(23);
Stock z = x + y;

运算符重载的本质是一个函数,当编译器检测到运算符的操作数是Stock类时,就会自动调用对应的运算符重载函数。

另一个实现运算符重载的方式是在类外实现,利用友元的方式。在有些情况下,类内实现的方式不能满足需求。例如,对于这种情况:

Stock s1(23);
Stock s = 2 * s1;

注意运算符的左边是调用对象,这时调用对象int需要访问s1中的price对象,但是price是一个private对象,不能被直接访问,这时就需要利用友元的方式实现运算符的重载,从而让int对象可以直接访问Stock对象中的private成员。其语法为:

class Stock{
    //声明一个函数为该类的友元函数
    friend Stock operator*(double,const Stock &);
}

//定义函数的时候不需要加friend关键字
Stock operator*(double m, const Stock & s){
    return Stock(m * s.price);
}

重载运算符的限制

在对运算符进行重载的时候有一些需要注意的点:

  • 重载后的运算符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载运算符。
  • 使用运算符时不能违反运算符原来的语法规则。也就是说对运算符重载之后不能改变原来运算符的用法,例如二元操作符不能重载成一元操作符,重载之后运算符的优先级不能改变。
  • 不能创建新的运算符,例如不能定义s1 @ s2
  • 下列运算符只能通过成员函数在类内重载:=,(),[],->
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值