c++的运算符重载

C++ 扩展了对运算符的重载,允许自定义特殊的运算符函数,这种函数描述了特定的运算符与类之间的关系。运算符函数可以是类成员函数,也可以是友元函数,对于某个运算符op,其运算函数的格式如下:

  operator op(argument-list)

argument-list 表示改运算符的操作数。如果运算符函数是类成员函数,则第一个操作数是调用对象,它不在argumen-list中。假设有一个Vector类,其头文件如下

class MyVec {
private:
    double x,y;
public:
    // 构造函数
    MyVec();
    MyVec(double x_, double y_);
    ~MyVec();
    // 重载的运算符函数,为MyVec类的成员函数
    MyVec operator+(const MyVec & v) const;
    MyVec operator-(const MyVec & v) const;
    MyVec operator-() const;
    MyVec operator*(double n) const;
    // 利用友元函数重载的运算符函数,为非成员函数
    friend MyVec operator*(double n, const MyVec & v);
    friend std::ostream & operator<<(std::ostream & os, const MyVec & v);
};

如果vec1,vec2和vec3都是MyVec对象,则可以用下面的语句来调用运算符函数

  vec3 = vec1.operator+(vec2);
  vec3 = vec1 + vec2;
  vec3 = vec1 - vec2;
  vec3 = -vec1;// 求负
  vec3 = vec1 * 2.0;// 调用重载的运算符成员函数
  vec3 = 2.0 * vec1;// 调用重载的友元运算符函数
  cout << vec3 ;

在使用加法和减法法操作时vec1 op vec2回被转换成vec1.operator op(vec2)执行,此时第一操作符为MyVec对象,当第一操作符不是MyVec对象时,列如:vec3 = 2.0*vec1时,由于没有在double中重载operator*(MyVec),所以无法通过编译器,这种时候就需要使用友元函数了,友元函数是一种非成员变量,但是它可以使用类的私有属性。友元函数例如friend MyVec operator*(double n, const MyVec & v)friend为友元函数的关键字,当vec3 = 2.0*vec1执行时就会调用改友元函数了。同样在重载<<操作符时,第一操作符为ostream,故需要使用友元函数。

为了在使用<<操作符时能够实现cout << "a" << vec1 << endl的效果,让重载的运算符函数,返回ostream的引用,即cout << vec1返回的仍然时cout对象,故可以连续使用<<运算符。MyVec类的具体实现如下:

MyVec::MyVec() {
    x = y =0;
}

MyVec::MyVec(double x_, double y_){
    x = x_;
    y = y_;
}
MyVec::~MyVec() = default;

MyVec MyVec::operator+(const MyVec & v) const{
    return MyVec(x + v.x, y + v.y);
}

MyVec MyVec::operator-(const MyVec &v) const {
    return MyVec(x - v.x, y - v.y);
}
MyVec MyVec::operator-() const {
    return MyVec(-x,-y);
}
MyVec MyVec::operator*(double n) const {
    return MyVec(x * n, y * n);
}

MyVec operator*(double n, const MyVec &v) {
    return v*n;
}

std::ostream & operator<<(std::ostream &os, const MyVec &v) {
    os << "(x,y) = (" << v.x << "," << v.y << ")";
    return os;
}

测试代码如下

int main(){

    using std::cout;

    MyVec vec;
    MyVec vec1(5.0,4.0);
    MyVec vec2(3.0, 4.0);
    cout << "vec1 = " << vec1 << "\n";

    MyVec sum = vec1 + vec2;
    cout << "(vec1 + vec2) = " << sum << "\n";
    cout << "(vec1 - vec2) = " << vec1 - vec2 << "\n";
    cout << "(-vec2) = " << -vec2 << "\n";

    double n = 2.0;

    cout << "(vec1 * 2.0) = " << vec1 * n << "\n";
    cout << "(2.0 * vec2) = " << n * vec2 << "\n";


    return 0;
}

最后的输出为:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值