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 条评论
登录 后参与评论

相关文章

来自专栏wym

Enumeration类 重要的遍历

这是检测Enumeration 对象是否还有元素,有则返回true,否则faluse

21110
来自专栏http://www.cnblogs.com

python传参是传值还是传引用

在此之前先来看看变量和对象的关系:Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是对象。而变量是对象的一个引用(又称为名字或者标...

429150
来自专栏鸿的学习笔记

有趣的Scala模式匹配

它被称为模式匹配,模式匹配包含了一系列以case关键字开头的分支,每一个分支包含一个模式或者是多个表达式。模式有很多种,例如常量模式('*',1),变量模式(可...

9140
来自专栏C#

解析C#类中的构造函数

《解析C#类中的构造函数》 一.  C#中的构造函数概述: C#中类包含数据成员和函数成员。函数成员提供了操作类中数据的某些功能,包括方法、属性、构造器和终结器...

21750
来自专栏java学习

Java每日一练(2017/6/16)

题目要求 本期题目:(注解练习) 1.自定义一个可以用来接收用户登录信息的注解,将用户名和密码设置到验证的方法中, 例如: @LoginInfo(name="张...

300130
来自专栏程序员互动联盟

【编程基础第十二讲】web开发编程基础--回调函数

存在问题: 我们都知道C语言存在回调函数,那么JavaScript中的回调函数是如何实现的? 如何实施: a.非参数回调函数 这类回调函数大多比较简单,往往传一...

26050
来自专栏积累沉淀

程序、进程、线程的关系

创建一个Java线程常见的有两种方式: 1.继承Thread类 两种表示方法: (1).外部类 import java.util.D...

20160
来自专栏与神兽党一起成长

将JSON对象格式化输出(breakdown篇)

上篇提到的prettyjson工具,经我改写之后,可以JavaScript对象格式输出缩进排版的JSON格式。如下所示:

30530
来自专栏MelonTeam专栏

Swift学习笔记(初始化过程)

网上介绍swift基本语法的文章已经有不少,我这里就不累赘。这篇文章主要想讲的是:swift的初始化。

46560
来自专栏前端大白专栏

Object.keys()具体使用方式

21350

扫码关注云+社区

领取腾讯云代金券