亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++中的操作符重載詳細解析

2020-01-26 15:49:49
字體:
來源:轉載
供稿:網友


一、什么是操作符重載
操作符重載可以分為兩部分:“操作符”和“重載”。說到重載想必都不陌生了吧,這是一種編譯時多態,重載實際上可以分為函數重載和操作符重載。運算符重載和函數重載的不同之處在于操作符重載重載的一定是操作符。我們不妨先直觀的看一下所謂的操作符重載:

復制代碼 代碼如下:

#include <iostream>

using namespace std;

int main()
{
    int a = 2 , b = 3;
    float c = 2.1f , d = 1.2f;
    cout<<"a + b = "<<a+b<<endl;
    cout<<"c + d = "<<c+d<<endl;
    return 0;
}


我們看到操作符“+”完成float和int兩種類型的加法計算,這就是操作符重載了。這些內置類型的操作符重載已經實現過了,但是如果現在我們自己寫過的類也要實現實現類似的加法運算,怎么辦呢??比如現在現在有這樣一個點類point,要實現兩個點的相加,結果是橫縱坐標都要相加,這時候就需要我們自己寫一個操作符重載函數了。
復制代碼 代碼如下:

#include <iostream>

using namespace std;

class point
{   
    double x;
    double y;
public:
    double get_x()
    {
        return x;
    }
    double get_y()
    {
        return y;
    }
    point(double X = 0.0 , double Y = 0.0):x(X),y(Y){};
    point operator +(point p);
};
//重載操作符“+”
point point::operator +(point p)
{
    double x = this->x + p.x;
    double y = this->y + p.y;
    point tmp_p(x,y);
    return tmp_p;
}
int main()
{
    point p1(1.2,3.1);
    point p2(1.1,3.2);
    point p3 = p1+p2;
    cout<<p3.get_x()<<" "<<p3.get_y()<<endl;
    return 0;
}


二、實現操作符重載的兩種方式
操作符重載的實現方式有兩種,即通過“友元函數”或者“類成員函數”。

1.友元函數重載操作符的格式:

復制代碼 代碼如下:

class 類名
{
    friend 返回類型 operator 操作符(形參表);
};
//類外定義格式:
返回類型 operator操作符(參數表)
{
    //函數體
}

2.類成員函數實現操作符重載的格式:
復制代碼 代碼如下:

class 類名
{
public:
    返回類型 operator 操作符(形參表);
};
//類外定義格式
返回類型 類名::operator 操作符(形參表)
{
    //函數體
}

這樣說吧,還是不足以比較這兩種實現方式的區別,我們分別用兩種實現方式寫point類的”+“和”-“的重載。代碼如下:
復制代碼 代碼如下:

#include <iostream>

using std::endl;
using std::cout;

class point
{   
    double x;
    double y;
public:
    double get_x()
    {
        return x;
    }
    double get_y()
    {
        return y;
    }
    point(double X = 0.0 , double Y = 0.0):x(X),y(Y){};
    friend point operator -(point p1,point p2);
    point operator +(point p);
};
//重載操作符“-”
point operator -(point p1,point p2)
{
    double x = p1.get_x() - p2.get_x();
    double y = p1.get_y() - p2.get_y();
    point p3(x,y);
    return p3;
}
//重載操作符“+”
point point::operator +(point p)
{
    double x = this->x + p.x;
    double y = this->y + p.y;
    point tmp_p(x,y);
    return tmp_p;
}
int main()
{
    point p1(1.2,3.2);
    point p2(1.1,3.1);
    point p3 = p1+p2;
    point p4 = operator-(p1,p2);
    cout<<p3.get_x()<<" "<<p3.get_y()<<endl;
    cout<<p4.get_x()<<" "<<p4.get_y()<<endl;
    return 0;
}


這里不知道大家看到沒有,利用友元函數重載二元操作符”-“時,形式參數是兩個,而利用類成員函數時,形式參數卻只有一個。這時因為類成員函數中存在this指針,這相當于一個參數,所以類成員實現操作符重載需要的形式參數比原來少一個,這比如:利用類成員函數實現一元操作符”-“,就不需要參數了。也正是因為這個原因,友元函數實現的操作符重載是有限制的,比如:[] ,(),->和 =不能利用友元函數實現運算符的重載。

在實際開發過程中,單目運算符建議重載為成員函數,而雙目運算符建議重載為友元函數。通常下雙目運算符重載為友元函數比重載為成員函數更方便,但是有時雙目運算符必須重載為成員函數,例如賦值運算符=。還有如果需要修改對象內部的狀態,一般可以選擇利用類成員函數進行修改。

三、運算符重載的原則
這樣一看,運算符重載還是蠻簡單的嘛,實際上運算符重載也是要遵循一些原則的:

1.C++中只能對已有的C++運算符進行重載,不允許用戶自己定義新的運算符。

2.C++中絕大部分的運算符可重載,除了成員訪問運算符.,作用域運算符::,長度運算符sizeof以及條件運算符?:。

3.運算符重載后不能改變運算符的操作對象(操作數)的個數。如:"+"是實現兩個操作數的運算符,重載后仍然為雙目運算符。

4.重載不能改變運算符原有的優先級和原有的結合性。

5.運算符重載不能全部是C++中預定義的基本數據,這樣做的目的是為了防止用戶修改用于基本類型數據的運算符性質。

四、為什么要進行運算符重載
關于運算符重載要遵循這么多原則,那么為什么還要進行運算符重載呢?為什么我不是寫一個add()函數,代替operator +()呢??個人感覺C++中之所以要支持運算符的重載是為了與內置數據類型統一操作,比如:c = a + b 和 c = add(a,b),這看起來哪個更直觀一點呢,顯然是前者了。同時,我們希望操作我們自己定義的數據類型能像操作int和double這些內置數據類型一樣方便??赡芘e這個加法的例子有點不好,現在加入重載的運算符是[],<<,^,|等呢?這時我們要用什么成員函數代替呢??代替之后又是一種什么效果呢?會一眼就看出來這個函數要干什么嗎??

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品jizz在线观看麻豆| 亚洲男人天堂网站| 亚洲精品中文字幕女同| 91日韩在线视频| 亚洲国产精品悠悠久久琪琪| 欧美专区中文字幕| 97在线精品国自产拍中文| 国产精品高潮粉嫩av| 91极品女神在线| 亚洲va欧美va国产综合久久| 国产拍精品一二三| 国产精品视频中文字幕91| 欧美在线视频免费| 好吊成人免视频| 精品国产视频在线| 国产精品av免费在线观看| 性欧美xxxx交| 91精品国产成人| 亚洲色图美腿丝袜| 久久国产精品久久久| 日韩精品在线免费观看视频| 92看片淫黄大片欧美看国产片| 欧美激情国内偷拍| 成人久久18免费网站图片| 日韩欧美精品网址| 亚洲精品中文字| 国产精品久久77777| 日本午夜在线亚洲.国产| 日韩亚洲国产中文字幕| 2019日本中文字幕| 日韩欧美一区二区三区久久| 欧美老女人性视频| 久久精品99国产精品酒店日本| 日韩av在线不卡| 欧美三级欧美成人高清www| 日韩av一卡二卡| 欧美多人爱爱视频网站| 久久久久久久国产精品| 日日摸夜夜添一区| 久久久久久久久网站| 隔壁老王国产在线精品| 尤物99国产成人精品视频| 不卡av日日日| 亚洲自拍高清视频网站| 国产精欧美一区二区三区| 成人精品一区二区三区电影黑人| 色婷婷久久av| 成人免费网站在线| 91人成网站www| 日本韩国在线不卡| 久久精品视频中文字幕| 亚洲欧美国产制服动漫| 亚洲一区二区久久久久久久| 色偷偷噜噜噜亚洲男人| 久久久久99精品久久久久| 亚洲欧洲日产国码av系列天堂| 日韩成人xxxx| 成人免费黄色网| 欧美性xxxxx极品| 深夜福利国产精品| 性欧美视频videos6一9| 欧美视频在线免费| 国产午夜一区二区| 亚洲免费中文字幕| 午夜精品在线视频| 国产精品综合久久久| 97国产精品人人爽人人做| 97人人做人人爱| 91精品国产综合久久香蕉| 成人av色在线观看| 日韩精品视频在线观看网址| 国产精品久久久久久av| 久久久精品影院| 国产欧美一区二区三区四区| 色吧影院999| 国产综合在线看| 国产精品精品国产| 国产精品成人一区二区| 国产丝袜一区视频在线观看| 亚洲精品videossex少妇| 欧美精品九九久久| 亚洲电影免费观看高清完整版在线观看| 欧美日韩电影在线观看| 国产亚洲精品va在线观看| 国产精品成人一区二区| 亚洲一区二区三区在线免费观看| 亚洲欧美自拍一区| 在线电影欧美日韩一区二区私密| 欧美精品九九久久| 欧美日韩国产中文精品字幕自在自线| 欧美日韩亚洲天堂| 一本大道久久加勒比香蕉| 国产丝袜一区二区三区| 日韩美女免费观看| 国产亚洲成av人片在线观看桃| 国产日韩精品视频| 亚洲白虎美女被爆操| 亚洲精品久久久久中文字幕欢迎你| 日韩中文视频免费在线观看| 日韩在线视频国产| 久久久国产精品免费| 欧美电影在线观看完整版| 国模gogo一区二区大胆私拍| 国产一区二区成人| 国产精品久久久久不卡| 一区二区三区亚洲| 国产欧美日韩精品专区| 国产精品久久久91| 成人国产精品一区二区| 国产成人aa精品一区在线播放| 久久精品视频在线| 国产精品日韩在线观看| 亚洲精品动漫100p| 中文字幕亚洲图片| 91性高湖久久久久久久久_久久99| 中文字幕日韩综合av| 国产精品美女免费视频| 欧美一级淫片播放口| 久久99国产精品自在自在app| 69影院欧美专区视频| **欧美日韩vr在线| 黑丝美女久久久| 国产精品久久久久久久久粉嫩av| 亚洲精品日韩欧美| 欧美精品久久久久| 不卡av日日日| 中文字幕日本欧美| 国产欧美最新羞羞视频在线观看| 国产精品老女人视频| 在线看福利67194| 久久精品视频中文字幕| 亚洲精品91美女久久久久久久| 一区二区三区 在线观看视| 91久久久久久国产精品| 日韩视频免费中文字幕| 国产丝袜一区二区三区| 亚洲男人天堂九九视频| 欧美性猛交xxxx富婆弯腰| 黄色精品一区二区| 国产视频久久网| 欧美成人激情在线| 亚洲色在线视频| 亚洲欧美制服丝袜| 2019中文字幕全在线观看| 国产精品欧美日韩久久| 538国产精品视频一区二区| 中文字幕9999| 欧美精品18videos性欧美| 疯狂蹂躏欧美一区二区精品| 日韩美女av在线免费观看| 欧美成人免费全部观看天天性色| 欧美性色视频在线| 成人欧美一区二区三区在线湿哒哒| 亚洲天堂av女优| 97国产真实伦对白精彩视频8| 久久天堂电影网| 亚洲天堂第一页| 国产男女猛烈无遮挡91| 国产精品高潮呻吟久久av无限| 国产精品嫩草影院久久久| 亚洲欧洲一区二区三区久久| 亚洲高清不卡av| 精品精品国产国产自在线| 色诱女教师一区二区三区|