C++操作符重载

什么是重载:让操作符具有自己想要的功能。

#ifndef _ARRAY_H_
#define _ARRAY_H_

class Array
{
private:
    int mLength;
    int* mSpace;

public:
    Array(int length);
    Array(const Array& obj);

    int length();
    void setData(int index, int value);
    int getData(int index);
    ~Array();

    // 重载[]操作符,从数组类中取值(int类型)
    int &operator[](int i);

    // 重载操作符=,复制数组类
    Array& operator=(Array &aa);

    // 重载操作符==,比较两个数组类是否相同
    bool operator==(Array &aa);
};
#endif
Array.h
#include "iostream"
#include "Array.h"
using namespace std;

Array::Array(int length)
{
    if( length < 0 )
    {
        length = 0;
    }
    
    mLength = length;
    mSpace = new int[mLength];
}

Array::Array(const Array& obj)
{
    mLength = obj.mLength;
    
    // 开辟mLength大小的内存空间mSpace
    mSpace = new int[mLength];
    
    for(int i=0; i<mLength; i++)
    {
        mSpace[i] = obj.mSpace[i];
    }
}

int Array::length()
{
    return mLength;
}

void Array::setData(int index, int value)
{
    mSpace[index] = value;
}

int Array::getData(int index)
{
    return mSpace[index];
}

Array::~Array()
{
    mLength = -1;
    delete[] mSpace;
}

int& Array::operator[](int i)
{
    return this->mSpace[i];
}

Array& Array::operator=(Array &aa)
{
    int i = 0;

    if(this->mSpace != NULL)
    {
        free(mSpace);
    }
    this->mLength = aa.mLength;

    mSpace = new int[mLength];
    
    for(i=0; i<mLength; i++)
    {
        (*this)[i] = aa[i];
    }
    return (*this);
}

bool Array::operator==(Array &aa)
{
    int i = 0;
    if(this->mLength != aa.mLength)
    {
        return false;
    }
    for(i=0; i<this->mLength; i++)
    {
        if(mSpace[i] != aa.mSpace[i])
        {
            return false;
        }
    }
    return true;
}
Array.cpp
#include "iostream"
#include "Array.h"
using namespace std;

int main()
{
    Array a1(10);
   
    for(int i=0; i<a1.length(); i++)
    {
        //a1.setData(i, i);    //改写[] 功能一
        a1[i] = i;
    }
    
    for(int i=0; i<a1.length(); i++)
    {
        //printf("array %d: %d\n", i, a1.getData(i));
        printf("array %d: %d\n", i, a1[i]);
    }
    Array a2 = a1;
    Array a3(20);

    a3 = a2;    // 重载操作符= 功能二
    for(int i=0; i<a2.length(); i++)
    {
        //printf("array %d: %d\n", i, a2.getData(i));
        printf("array %d: %d\n", i, a2[i]);
    }
    a1[9] = 1000;
    
    if (a1==a2)    // 重载操作符== 功能三
    {
        cout << "两个数组完全相等!"  << endl;
    }
    else
    {
        cout << "两个数组不相等!" << endl;
    }
    return 0;
}
ArrayText.cpp

重载操作符注意点:

1. 重载操作符有两种方法:1> 用成员函数实现(大多数) 2> 用全局函数(友元函数)实现:当无法获取到调用这个操作符的对象的源码的时候,如:重载<<操作符

// 友元函数实现左移操作符,打印对象
friend ostream &operator<<(ostream &out, Complex &cc);

2. 前置++(--)和后置++(--)注意点

//类成员函数实现前置++, 返回值为自身的引用
Complex &operator++()

//类成员函数实现后置++, 返回值为局部对象
Complex operator++(int )

3. 特别注意:重载=或者是[]等操作符时,返回的是引用,只有引用可以当左值。还需注意的是,调用者的原本的指针域是否是空,不为空则需释放!

原文地址:https://www.cnblogs.com/gossiplee/p/4614263.html