zoukankan      html  css  js  c++  java
  • 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. 特别注意:重载=或者是[]等操作符时,返回的是引用,只有引用可以当左值。还需注意的是,调用者的原本的指针域是否是空,不为空则需释放!

  • 相关阅读:
    vue与后台交互之post用法
    django框架两个使用模板实例
    917,仅仅反转字母(简单)
    836,矩形重叠 (简单)
    860,柠檬水找零(简单)
    使用类创建对象后找不到的问题
    8_19 数据库
    8_16 MySQL数据库一
    Mysql的安装与配置
    文件操作中,使用递归退出不了。
  • 原文地址:https://www.cnblogs.com/gossiplee/p/4614263.html
Copyright © 2011-2022 走看看