最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中的操作符重載詳細(xì)解析

 更新時(shí)間:2013年09月24日 09:51:32   作者:  
運(yùn)算符重載后不能改變運(yùn)算符的操作對(duì)象(操作數(shù))的個(gè)數(shù);如:"+"是實(shí)現(xiàn)兩個(gè)操作數(shù)的運(yùn)算符,重載后仍然為雙目運(yùn)算符


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

復(fù)制代碼 代碼如下:

#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兩種類型的加法計(jì)算,這就是操作符重載了。這些內(nèi)置類型的操作符重載已經(jīng)實(shí)現(xiàn)過(guò)了,但是如果現(xiàn)在我們自己寫過(guò)的類也要實(shí)現(xiàn)實(shí)現(xiàn)類似的加法運(yùn)算,怎么辦呢??比如現(xiàn)在現(xiàn)在有這樣一個(gè)點(diǎn)類point,要實(shí)現(xiàn)兩個(gè)點(diǎn)的相加,結(jié)果是橫縱坐標(biāo)都要相加,這時(shí)候就需要我們自己寫一個(gè)操作符重載函數(shù)了。
復(fù)制代碼 代碼如下:

#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;
}


二、實(shí)現(xiàn)操作符重載的兩種方式
操作符重載的實(shí)現(xiàn)方式有兩種,即通過(guò)“友元函數(shù)”或者“類成員函數(shù)”。

1.友元函數(shù)重載操作符的格式:

復(fù)制代碼 代碼如下:

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

2.類成員函數(shù)實(shí)現(xiàn)操作符重載的格式:
復(fù)制代碼 代碼如下:

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

這樣說(shuō)吧,還是不足以比較這兩種實(shí)現(xiàn)方式的區(qū)別,我們分別用兩種實(shí)現(xiàn)方式寫point類的”+“和”-“的重載。代碼如下:
復(fù)制代碼 代碼如下:

#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;
}


這里不知道大家看到?jīng)]有,利用友元函數(shù)重載二元操作符”-“時(shí),形式參數(shù)是兩個(gè),而利用類成員函數(shù)時(shí),形式參數(shù)卻只有一個(gè)。這時(shí)因?yàn)轭惓蓡T函數(shù)中存在this指針,這相當(dāng)于一個(gè)參數(shù),所以類成員實(shí)現(xiàn)操作符重載需要的形式參數(shù)比原來(lái)少一個(gè),這比如:利用類成員函數(shù)實(shí)現(xiàn)一元操作符”-“,就不需要參數(shù)了。也正是因?yàn)檫@個(gè)原因,友元函數(shù)實(shí)現(xiàn)的操作符重載是有限制的,比如:[] ,(),->和 =不能利用友元函數(shù)實(shí)現(xiàn)運(yùn)算符的重載。

在實(shí)際開發(fā)過(guò)程中,單目運(yùn)算符建議重載為成員函數(shù),而雙目運(yùn)算符建議重載為友元函數(shù)。通常下雙目運(yùn)算符重載為友元函數(shù)比重載為成員函數(shù)更方便,但是有時(shí)雙目運(yùn)算符必須重載為成員函數(shù),例如賦值運(yùn)算符=。還有如果需要修改對(duì)象內(nèi)部的狀態(tài),一般可以選擇利用類成員函數(shù)進(jìn)行修改。

三、運(yùn)算符重載的原則
這樣一看,運(yùn)算符重載還是蠻簡(jiǎn)單的嘛,實(shí)際上運(yùn)算符重載也是要遵循一些原則的:

1.C++中只能對(duì)已有的C++運(yùn)算符進(jìn)行重載,不允許用戶自己定義新的運(yùn)算符。

2.C++中絕大部分的運(yùn)算符可重載,除了成員訪問(wèn)運(yùn)算符.,作用域運(yùn)算符::,長(zhǎng)度運(yùn)算符sizeof以及條件運(yùn)算符?:。

3.運(yùn)算符重載后不能改變運(yùn)算符的操作對(duì)象(操作數(shù))的個(gè)數(shù)。如:"+"是實(shí)現(xiàn)兩個(gè)操作數(shù)的運(yùn)算符,重載后仍然為雙目運(yùn)算符。

4.重載不能改變運(yùn)算符原有的優(yōu)先級(jí)和原有的結(jié)合性。

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

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

相關(guān)文章

  • 詳解C語(yǔ)言中結(jié)構(gòu)體的自引用和相互引用

    詳解C語(yǔ)言中結(jié)構(gòu)體的自引用和相互引用

    這篇文章主要介紹了C語(yǔ)言中結(jié)構(gòu)體的自引用和相互引用,詳細(xì)解析了結(jié)構(gòu)體中指針的指向情況,需要的朋友可以參考下
    2016-04-04
  • C++實(shí)現(xiàn)Window環(huán)境聊天室功能

    C++實(shí)現(xiàn)Window環(huán)境聊天室功能

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)Window環(huán)境聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C 語(yǔ)言基礎(chǔ)之C語(yǔ)言的常見(jiàn)關(guān)鍵字

    C 語(yǔ)言基礎(chǔ)之C語(yǔ)言的常見(jiàn)關(guān)鍵字

    C語(yǔ)言中有一些預(yù)先定義的字符串,他們本身被賦予了自身的功能。并且我們?cè)诙x變量的時(shí)候,不能去搶他們的名字來(lái)用。他們就是今天的主角:關(guān)鍵字,下面文章將給大家做詳細(xì)介紹
    2021-09-09
  • C++ Futures與Promises線程使用示例講解

    C++ Futures與Promises線程使用示例講解

    future和promise的作用是在不同線程之間傳遞數(shù)據(jù)。使用指針也可以完成數(shù)據(jù)的傳遞,但是指針?lè)浅NkU(xiǎn),因?yàn)榛コ饬坎荒茏柚怪羔樀脑L問(wèn);而且指針的方式傳遞的數(shù)據(jù)是固定的,如果更改數(shù)據(jù)類型,那么還需要更改有關(guān)的接口,比較麻煩
    2022-11-11
  • 雙緩沖解決VC++繪圖時(shí)屏幕閃爍

    雙緩沖解決VC++繪圖時(shí)屏幕閃爍

    相信很多人在做圖形界面開發(fā)時(shí),常常會(huì)遇到屏幕閃爍的情況,當(dāng)然我也不例外,下面我們就來(lái)詳細(xì)探討下這個(gè)問(wèn)題的解決辦法
    2015-08-08
  • 利用C語(yǔ)言實(shí)現(xiàn)將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換

    利用C語(yǔ)言實(shí)現(xiàn)將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了2個(gè)函數(shù),分別是sprintf和sscanf,可以用來(lái)實(shí)現(xiàn)將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • C++中std::ifstream::readsome和std::ifstream::read的區(qū)別解析

    C++中std::ifstream::readsome和std::ifstream::read的區(qū)別解析

    ?std::ifstream::readsome和std::ifstream::read?的主要區(qū)別在于它們處理輸入流的方式和可能返回的結(jié)果,下面給大家介紹C++中std::ifstream::readsome和std::ifstream::read的區(qū)別解析,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • 實(shí)現(xiàn)一個(gè)random?shuffle算法示例

    實(shí)現(xiàn)一個(gè)random?shuffle算法示例

    這篇文章主要為大家介紹了實(shí)現(xiàn)一個(gè)random?shuffle算法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • C++類的空指針調(diào)用成員函數(shù)的代碼

    C++類的空指針調(diào)用成員函數(shù)的代碼

    這篇文章主要介紹了C++類的空指針調(diào)用成員函數(shù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • C++利用VLC庫(kù)制作音視頻的示例代碼

    C++利用VLC庫(kù)制作音視頻的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C++如何利用VLC庫(kù)制作音視頻,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下
    2024-01-01

最新評(píng)論

曲沃县| 和林格尔县| 保山市| 康定县| 陕西省| 耿马| 额敏县| 凭祥市| 肃南| 金昌市| 农安县| 南召县| 开远市| 嵊泗县| 广昌县| 得荣县| 安宁市| 沙湾县| 宝鸡市| 永州市| 峨眉山市| 手机| 桐城市| 徐闻县| 中牟县| 襄城县| 寻乌县| 济阳县| 邹城市| 兖州市| 沈阳市| 镇赉县| 康保县| 革吉县| 永川市| 佛冈县| 余江县| 斗六市| 汕尾市| 嘉兴市| 鄂伦春自治旗|