frankfan的胡思乱想

学海无涯,回头是岸

运算符重载

运算符重载

运算符重载的主要目的是为了更加简洁的书写代码,C++语言语法繁复,形式复杂多样,从源码的角度上看异常复杂。C++还支持模板编程,这样一来源码显得更加复杂了,因此,C++也支持将常见的运算符进行重载,简化形式。

并非所有运算符都支持重载,如点. 就不支持,此外还有其他,无需记住,编译器会提示。

运算符重载的本质就是通过将运算符函数化,运算符重载就是定义新的运算符函数。

不过在重载运算符的过程中需要有几点注意:

1、不要改变原有运算符的语义

2、满足原有运算符的的运算流程


运算符种类繁多,这里分别讲3个具有代表意义的运算符重载类型:

1、常规普通运算符重载

2、全局运算符重载

3、输入输出运算符重载


常规普通运算符重载

常见的普通运算符如+ - * / % 等运算符都可以被重载(此外,逻辑运算符 位运算符等都支持重载)

重载 (+)(++)两个运算符

重载运算符前,需要明确该运算符的原始意义以及原始运算规则。

  • 加号运算符

    • 支持a + b

    • 支持a + b + c

    • 不支持(a + b) = c

      等等。可以根据自己的需求实现运算规则,并非重载后的运算符要满足所有的运算规则。

  • ++运算符,分为++aa++

    • 支持++a
    • 支持++a = b

#include <iostream>
using namespace std;

class Node{
public:
  Node(int v = 0):value(v){}
  void showvalue(){cout<<value<<endl;}
   
  const Node& operator+(const Node &node){
        
    this->value = node.value + this->value;
    return *this;
  }
    
  const int operator+(const Node &node)const{
       
    return this->value + node.value;
  }
  
  Node & operator++(){//前缀++
    value += 1;
    return *this;
  }
  
  void operator++(int){//后缀++
    value+=1;
  }
  
private:
  int value;
};

int main(){
  
  Node node(11);
  Node node2(22);
  Node node3 = node + node2;//33
  
  Node node4(33);
  node3 = node + node2 + node4;//66

  //这里有一个一个注意的地方,那就是『隐式构造』
  Node tmpNode = 11;//这是可以直接赋值的,实际上这是在隐式的调用带参构造函数,直接生成了一个Node对象.前提是要自定义了带参构造函数
  return 0;
}

全局运算符重载

上面的运算符重载node1+node2本质是在调用node1.operator+(node2)这是可行的。node1+2也就是node1.operator+(2)也是可行的。

但是2+node1却不行。因此整型类型并没有重载运算符+。

这时候我们需要使用全局运算符重载来实现目标

#include <iostream>
using namespace std;
class Node(){
public:
  Node(int v):value(v){}
	friend int operator+(int v,const Node &node);  
private:
  int value;
};

//全局运算符重载
int operator+(int v,const Node &node){
  return v + node.value;
}

int main(){
  Node node(11);
  Node node2 = 22 + node;//22.operator+(node),支持
}

全局运算符重载需要注意的是通常需要提供一个额外的参数当做运算符的左操作数。

与自定义类配合使用时通常需要定义为自定义类的友元函数,方便访问到自定义类的私有成员

重载输入输出运算符

重载输入输出运算符实际是全局运算符重载的一部分。

#include <iostream>
using namespace std;
class Node{
public:
  Node(int v):value(v){}
  friend ostream & operator<<(ostream &os,const Node &node);
private:
  int value;
};

ostream & operator<<(ostream &os,const Node &node){
  
  os << node.value;
  reutn os;
}
int main(){

  Node node(11);
  cout<<node<<"end_"<<endl;//正常输出
  return 0;
}

posted on 2021-12-28 00:20  shadow_fan  阅读(184)  评论(0)    收藏  举报

导航