专栏首页流媒体c++操作符重载

c++操作符重载

定义

运算符重载的 实质 是 函数的重载

  • 使用意义
    • 赋予操作符更多的意义,同一个运算符,对不同类型的操作数,所发生的行为不同是
    • 程序更加简洁
  • 写法格式:返回值 operator运算符(参数列表){}
  • 重载的要求:
    • 1、内置类型的操作符不能被重载
    • 2、不能为内置类型定义其他的操作符
    • 3、操作符重载不能改变操作符的优先级
    • 4、操作数个数不能改变
  • 重载方式:
    • 1、类的成员方法
    • 2、类的有友元方法
    • 3、全局方法

注意:

  • ++a和a++的重载区别。a++的重载方法中多一个占位参数
  • 最好不好重载&&和||。因为无法实现短路功能。
  • =, ->, [], ()不可以是全局域中的重载
  • >><<的从在需要使用友元方法或重载方法。因为第一个操作类是ostream或istream。而我们无法在ostream和istream中定义重载方法,所以只能使用类的友元方法或全局方法来重载

示例

  • Array.h
//
// Created by eric on 2017/8/14.
//

#ifndef CHONGZAI_ARRAY_H
#define CHONGZAI_ARRAY_H

#include "iostream"

using namespace std;

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

    friend Array operator+(Array &array1, Array &array2);

    friend ostream &operator<<(ostream &out, Array &array);

    friend istream &operator>>(istream &in, Array &array);

public:
    Array(int len = 0);

    Array(const Array &array);

    Array(const int *arr);

    void setData(int index, int data);

    int getData(int index);

    int &operator[](int index);

    void operator=(Array &array);

    Array &operator()(Array &array);

    void print();

    ~Array();

    int getMLength() const;

    void setMLength(int mLength);

    int *getData() const;

    void setData(int *data);

};


#endif //CHONGZAI_ARRAY_H
  • Array.cpp
//
// Created by eric on 2017/8/14.
//

#include "Array.h"
#include <iostream>

using namespace std;


Array::Array(const int *arr) {

}

void Array::setData(int index, int data) {
    this->data[index] = data;
}

int &Array::operator[](int index) {
    return data[index];
}

Array::Array(int len) {
    mLength = len;
    data = new int[mLength];
}

Array::Array(const Array &array) {
    cout << "copy construct func" << endl;
    if (mLength > 0 && data != NULL) {
        delete[]data;
    }
    mLength = array.getMLength();
    data = new int[mLength];
    for (int i = 0; i < mLength; i++) {
        data[i] = array.getData()[i];
    }
}

int Array::getMLength() const {
    return mLength;
}

void Array::setMLength(int mLength) {
    Array::mLength = mLength;
}

int *Array::getData() const {
    return data;
}

void Array::setData(int *data) {
    Array::data = data;
}

Array::~Array() {
    if (data != NULL) {
        delete[]data;
    }
}

void Array::operator=(Array &array) {
    cout << "operator=" << endl;
    if (mLength > 0 && data != NULL) {
        delete[]data;
    }
    mLength = array.getMLength();
    data = new int[mLength];
    for (int i = 0; i < mLength; i++) {
        data[i] = array.getData()[i];
    }
}

void Array::print() {
    for (int i = 0; i < mLength; i++) {
        cout << data[i] << " ";
    }
    cout << endl;
}

Array &Array::operator()(Array &array) {
    if (mLength >= array.getMLength()) {
        return *this;
    } else {
        return array;
    }
}

Array operator+(Array &array1, Array &array2) {
    cout << "operator+" << endl;
    int len = array1.mLength + array2.mLength;
    Array array(len);
    for (int i = 0; i < array1.mLength; i++) {
        array.setData(i, array1.getData(i));
    }
    for (int i = 0; i < array2.mLength; i++) {
        array.setData(array1.getMLength() + i, array2.getData(i));
    }
//    return array;
    array.print();
    array1.print();
    array2.print();
    return array;

}

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

ostream &operator<<(ostream &out, Array &array) {
    cout << "operator<<" << endl;
    for (int i = 0; i < array.getMLength(); i++) {
        cout << array.getData(i) << " ";
    }
    cout << endl;
    return out;
}

istream &operator>>(istream &in, Array &array) {
    cout << "&operator>>" << endl;
    for (int i = 0; i < array.mLength; i++) {
        in >> array[i];
    }
    return in;
}
  • main.cpp
#include <iostream>
#include "Array.h"

using namespace std;

int main() {
    Array array(3);
    for (int i = 0; i < array.getMLength(); i++) {
        array[i] = i * 10;
    }
    array.print();
    Array array1 = array;
    array1.print();
    Array array2(0);
    array2 = array;
    array2.print();
    Array array3(2);
    Array array4 = array3(array);
    array4.print();
    Array array5 = array + array1;
    cout << array5;
    Array array6(5);
    cin >> array6;
    cout << array6;
    return 0;
}
  • 运行结果
0 10 20
copy construct func
0 10 20
operator=
0 10 20
copy construct func
0 10 20
operator+
0 10 20 0 10 20
0 10 20
0 10 20
operator<<
0 10 20 0 10 20
&operator>>
1
1
2
2
3
3
4
4
5
5
operator<<
1 2 3 4 5

Process finished with exit code 0

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++模板

    用户2929716
  • dll生成和使用

    用户2929716
  • Android应用签名获取

    用户2929716
  • Kubernetes 网络排错指南

    原文链接:https://zhuanlan.zhihu.com/p/34558421

    DevOps时代
  • 【Chat】实验 -- 实现 C/C++下TCP, 服务器/客户端 "多人聊天室"

    书童小二
  • 找不到外星人,也许是因为人类出现得太早

    大数据文摘
  • 剑指OFFER之包含min函数的栈(九度OJ1522)

    题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 输入: 输入可能包含多个测试样例,输入以EOF结束。 对于每个测试案...

    用户1154259
  • SSL丨PHP代码实现SSL强制301跳转

    nginx 301 : if ($scheme = http ) { return 301 https://$host$request_uri; } apach...

    V站CEO-西顾
  • php array_chunk()函数用法与注意事项

    本文实例讲述了php array_chunk()函数用法与注意事项。分享给大家供大家参考,具体如下:

    砸漏
  • 【PAT甲级】Be Unique

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk

扫码关注云+社区

领取腾讯云代金券