运算符重载(一)

什么是运算符重载?

运算符重载就是把标准运算符(例如=,-,+,>等)应用于我们自己定义的数据类型的对象。其实重载本身的含义就是一次多意。函数重载就是一个函数名有多种不同的含义。

运算符重载的好处是直观自然,可以提高程序的可读性 体现了C++的可扩充性 运算符重载仅仅只是语法上的方便,它是另一种函数调用的方式 运算符重载,本质上是函数重载 不要滥用重载、因为它只是语法上的方便,所以只有在涉及的代码更容易写、尤其是更易读时才有必要重载。

运算符重载的形式有两种一种是成员函数形式的运算符重载,一种是非成员函数的形式的运算符重载

成员函数原型的格式: 函数类型 operator 运算符(参数表); 成员函数定义的格式: 函数类型 类名::operator 运算符(参数表){ 函数体; }

友元函数原型的格式: friend 函数类型 operator 运算符(参数表); 友元函数定义的格式: friend 函数类型 类名::operator 运算符(参数表){ 函数体; }

(一)成员函数形式重载举例:

 1 //Complex.h
 2 #ifndef COMPLEX_H
 3 #define COMPLEX_H
 4 class Complex
 5 {
 6 public:
 7     Complex();
 8     Complex(int real,int imag);
 9     ~Complex();
10     Complex& Add(const Complex& other);
11     void Display()const;
12     Complex operator+(const Complex& other);//运算符重载函数声明
13 private:
14     int m_real;
15     int m_imag;
16 };
17 #endif //COMPLEX_H
 1 #include "Complex.h"
 2 #include<iostream>
 3 using std::endl;
 4 using std::cout;
 5 
 6 Complex::Complex()
 7 {
 8 }
 9 Complex::Complex(int real, int imag) :m_imag(imag), m_real(real)
10 {
11 
12 }
13 
14 
15 Complex::~Complex()
16 {
17 }
18 
19 Complex& Complex::Add(const Complex& other){
20     m_real += other.m_real;
21     m_imag += other.m_imag;
22     return *this;
23 }
24 Complex Complex::operator+(const Complex& other){//运算符重载定义
25     int r = m_real + other.m_real;
26     int i = m_imag + other.m_imag;
27     return Complex(r, i);
28 }
29 void Complex::Display()const{
30 
31     cout << "m_real=" << m_real << endl;
32     cout << "m_imag=" << m_imag << endl;
33 }
 1 #include<iostream>
 2 #include"Complex.h"
 3 using std::endl;
 4 using std::cout;
 5 int main(){
 6     Complex c1(2,1);
 7     Complex c2(7,3);
 8     Complex c3 = c1 + c2;
 9     c1.Display();
10     c2.Display();
11     c3.Display();
12     return 0;
13 }

(二)友元函数重载运算符举例:

#ifndef COMPLEX_H
#define COMPLEX_H
class Complex
{
public:
    Complex();
    Complex(int real,int imag);
    ~Complex();
    Complex& Add(const Complex& other);
    void Display()const;
    //Complex operator+(const Complex& other);
    friend Complex operator+(const Complex& left,const Complex& right);//友元函数声明
private:
    int m_real;
    int m_imag;
};
#endif //COMPLEX_H
1 Complex operator+(const Complex& left, const Complex& right){
2     int r = left.m_real + right.m_real;
3     int i = left.m_imag + right.m_imag;
4     return Complex(r,i);
5 }

此处有一个注意的小点,就是在重载+号运算符时,可以成员函数重载,友元函数重载一起使用,但是设置断点后跟踪,发现调用的是成员函数重载的运算符。说明成员函数重载运算符比友元函数重载的优先级要高。

运算符重载的规则:

运算符重载不允许发明新的运算符。

不能改变运算符操作对象的个数。

运算符被重载后,其优先级和结合性不会改变。

一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数。

以下一些双目运算符不能重载为类的友元函数:=、()、[]、->。

类型转换运算符只能以成员函数方式重载

流运算符只能以友元的方式重载

posted @ 2016-06-28 16:37  阿瞒123  阅读(227)  评论(0)    收藏  举报