c++操作符重載

定義

運(yùn)算符重載的 實(shí)質(zhì) 是 函數(shù)的重載

  • 使用意義
    • 賦予操作符更多的意義悔雹,同一個(gè)運(yùn)算符伊佃,對(duì)不同類型的操作數(shù)掂骏,所發(fā)生的行為不同是
    • 程序更加簡(jiǎn)潔
  • 寫法格式:返回值 operator運(yùn)算符(參數(shù)列表){}
  • 重載的要求:
    • 1绩蜻、內(nèi)置類型的操作符不能被重載
    • 2絮识、不能為內(nèi)置類型定義其他的操作符
    • 3绿聘、操作符重載不能改變操作符的優(yōu)先級(jí)
    • 4、操作數(shù)個(gè)數(shù)不能改變
  • 重載方式:
    • 1次舌、類的成員方法
    • 2熄攘、類的有友元方法
    • 3、全局方法

注意:

  • ++a和a++的重載區(qū)別彼念。a++的重載方法中多一個(gè)占位參數(shù)
  • 最好不好重載&&和||挪圾。因?yàn)闊o(wú)法實(shí)現(xiàn)短路功能。
  • =, ->, [], ()不可以是全局域中的重載
  • >><<的從在需要使用友元方法或重載方法逐沙。因?yàn)榈谝粋€(gè)操作類是ostream或istream哲思。而我們無(wú)法在ostream和istream中定義重載方法,所以只能使用類的友元方法或全局方法來(lái)重載

示例

  • 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;
}
  • 運(yùn)行結(jié)果
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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吩案,一起剝皮案震驚了整個(gè)濱河市棚赔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌徘郭,老刑警劉巖靠益,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異残揉,居然都是意外死亡胧后,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門冲甘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)绩卤,“玉大人,你說我怎么就攤上這事江醇”舯铮” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵陶夜,是天一觀的道長(zhǎng)凛驮。 經(jīng)常有香客問我,道長(zhǎng)条辟,這世上最難降的妖魔是什么黔夭? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮羽嫡,結(jié)果婚禮上本姥,老公的妹妹穿的比我還像新娘。我一直安慰自己杭棵,他們只是感情好婚惫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般先舷。 火紅的嫁衣襯著肌膚如雪艰管。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天蒋川,我揣著相機(jī)與錄音牲芋,去河邊找鬼。 笑死捺球,一個(gè)胖子當(dāng)著我的面吹牛缸浦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播懒构,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼餐济,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼耘擂!你這毒婦竟也來(lái)了胆剧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤醉冤,失蹤者是張志新(化名)和其女友劉穎秩霍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚁阳,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铃绒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了螺捐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颠悬。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖定血,靈堂內(nèi)的尸體忽然破棺而出赔癌,到底是詐尸還是另有隱情,我是刑警寧澤澜沟,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布灾票,位于F島的核電站,受9級(jí)特大地震影響茫虽,放射性物質(zhì)發(fā)生泄漏刊苍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一濒析、第九天 我趴在偏房一處隱蔽的房頂上張望正什。 院中可真熱鬧,春花似錦号杏、人聲如沸婴氮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)莹妒。三九已至名船,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旨怠,已是汗流浹背渠驼。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鉴腻,地道東北人迷扇。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像爽哎,于是被迫代替她去往敵國(guó)和親蜓席。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • C++運(yùn)算符重載-上篇 本章內(nèi)容:1. 運(yùn)算符重載的概述2. 重載算術(shù)運(yùn)算符3. 重載按位運(yùn)算符和二元邏輯運(yùn)算符4...
    Haley_2013閱讀 2,291評(píng)論 0 51
  • 對(duì)于一個(gè)運(yùn)算符函數(shù)來(lái)說课锌,它或者是類的成員厨内,或者至少是含有一個(gè)類型的對(duì)象。 對(duì)箭頭運(yùn)算符來(lái)說渺贤,不 有不能重載的運(yùn)算符...
    HenryTien閱讀 373評(píng)論 0 1
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評(píng)論 1 51
  • 其實(shí)是看了朋友對(duì)電影寫的一篇文章雏胃,有點(diǎn)不吐不快,沒有看到思考志鞍,更多劇情的搬運(yùn)瞭亮,什么時(shí)候文字性價(jià)如此的低。所以也靠著...
    金津樂道閱讀 211評(píng)論 0 1
  • 仰望著蔚藍(lán)的天空厂汗,我原本是個(gè)一無(wú)所有的人… 我叫若小澄是個(gè)孤兒,在我4歲那年黍翎,我的家人還有家里的一切都被燒毀了面徽,而...
    柏凝閱讀 406評(píng)論 0 1