亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++ operator關鍵字(重載操作符)的用法詳解

 更新時間:2017年01月08日 08:18:18   投稿:jingxian  
下面小編就為大家?guī)硪黄狢++ operator關鍵字(重載操作符)的用法詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

operator是C++的關鍵字,它和運算符一起使用,表示一個運算符函數(shù),理解時應將operator=整體上視為一個函數(shù)名。

這是C++擴展運算符功能的方法,雖然樣子古怪,但也可以理解:一方面要使運算符的使用方法與其原來一致,另一方面擴展其功能只能通過函數(shù)的方式(c++中,“功能”都是由函數(shù)實現(xiàn)的)。

 一、為什么使用操作符重載?

對于系統(tǒng)的所有操作符,一般情況下,只支持基本數(shù)據(jù)類型和標準庫中提供的class,對于用戶自己定義的class,如果想支持基本操作,比如比較大小,判斷是否相等,等等,則需要用戶自己來定義關于這個操作符的具體實現(xiàn)。比如,判斷兩個人是否一樣大,我們默認的規(guī)則是按照其年齡來比較,所以,在設計person 這個class的時候,我們需要考慮操作符==,而且,根據(jù)剛才的分析,比較的依據(jù)應該是age。那么為什么叫重載呢?這是因為,在編譯器實現(xiàn)的時候,已經(jīng)為我們提供了這個操作符的基本數(shù)據(jù)類型實現(xiàn)版本,但是現(xiàn)在他的操作數(shù)變成了用戶定義的數(shù)據(jù)類型class,所以,需要用戶自己來提供該參數(shù)版本的實現(xiàn)。

二、如何聲明一個重載的操作符?

A:  操作符重載實現(xiàn)為類成員函數(shù)

重載的操作符在類體中被聲明,聲明方式如同普通成員函數(shù)一樣,只不過他的名字包含關鍵字operator,以及緊跟其后的一個c++預定義的操作符。

可以用如下的方式來聲明一個預定義的==操作符:

class person{
private:
  int age;
  public:
  person(int a){
    this->age=a;
  }
  inline bool operator == (const person &ps) const;
};

實現(xiàn)方式如下:

inline bool person::operator==(const person &ps) const
{

   if (this->age==ps.age)
    return true;
   return false;
}

調(diào)用方式如下:

#include
using namespace std;
int main()
{

 person p1(10);
 person p2(20);
 if(p1==p2) cout<<”the age is equal!”< return 0;
}

這里,因為operator ==是class person的一個成員函數(shù),所以對象p1,p2都可以調(diào)用該函數(shù),上面的if語句中,相當于p1調(diào)用函數(shù)==,把p2作為該函數(shù)的一個參數(shù)傳遞給該函數(shù),從而實現(xiàn)了兩個對象的比較。

B:操作符重載實現(xiàn)為非類成員函數(shù)(全局函數(shù))

對于全局重載操作符,代表左操作數(shù)的參數(shù)必須被顯式指定。例如:

#include
#include
using namespace std;
class person
{
public:
int age;
public:
};

bool operator==(person const &p1 ,person const & p2)

//滿足要求,做操作數(shù)的類型被顯示指定
{
if(p1.age==p2.age)
return true;
return false;
}
int main()
{
person rose;
person jack;
rose.age=18;
jack.age=23;
if(rose==jack)
cout<<"ok"< return 0;
}

C:如何決定把一個操作符重載為類成員函數(shù)還是全局名字空間的成員呢?

①如果一個重載操作符是類成員,那么只有當與他一起使用的左操作數(shù)是該類的對象時,該操作符才會被調(diào)用。如果該操作符的左操作數(shù)必須是其他的類型,則操作符必須被重載為全局名字空間的成員。

②C++要求賦值=,下標[],調(diào)用(), 和成員指向-> 操作符必須被定義為類成員操作符。任何把這些操作符定義為名字空間成員的定義都會被標記為編譯時刻錯誤。

③如果有一個操作數(shù)是類類型如string類的情形那么對于對稱操作符比如等于操作符最好定義為全局名字空間成員。

D:重載操作符具有以下限制:

(1)只有C++預定義的操作符集中的操作符才可以被重載;

(2)對于內(nèi)置類型的操作符,它的預定義不能被改變,應不能為內(nèi)置類型重載操作符,如,不能改變int型的操作符+的含義;

(3) 也不能為內(nèi)置的數(shù)據(jù)類型定義其它的操作符;

(4) 只能重載類類型或枚舉類型的操作符;

(5) 重載操作符不能改變它們的操作符優(yōu)先級;

(6) 重載操作符不能改變操作數(shù)的個數(shù);

(7) 除了對( )操作符外,對其他重載操作符提供缺省實參都是非法的;

E: 注意點

(1)后果載操操作符首先要確定它的返回值是左值,還是右值,如果是左值最返回引用,如果是右值那就直接返回值;

(2) +號等這樣的操作符沒有對象可以容納改變后值,對于這樣的情況最好返回數(shù)值,否則只能要操作符體內(nèi)創(chuàng)建臨時對象用于容納改變后的值,如果在堆中創(chuàng)建臨時對象返回指針或者引用,在操作符函數(shù)體外還需要釋放它,如果返回的對象而不是引用或者指針,那么效率是比較低的。如果返回的是數(shù)值,最好在該類的構(gòu)造函數(shù)中增加對該類型數(shù)值的轉(zhuǎn)換函數(shù),如:返回值是int類型,那么最好有一個int類型作為參數(shù)的構(gòu)造函數(shù)。

(3)在增量運算符中,放上一個整數(shù)形參,就是后增量運行符,它是值返回,對于前增量沒有形參,而且是引用返回,示例:

class Test

{

  public:

  Test(x=3){ m_value = x}

  Test &operator ++();  //前增量

  Test &operator ++(int);//后增量

private:

  Int m_value:

};

Test &Test::operator ++()

{

  m_value ++;  //先增量

  return *this; //返回當前對象

}

Test Test::operator ++(int)

{

  Test tmp(*this); //創(chuàng)建臨時對象

  m_value ++;    //再增量

  return temp;   //返回臨時對象

}

(4)因為強制轉(zhuǎn)換是針對基本數(shù)據(jù)類型的,所以對類類型的轉(zhuǎn)換需自定義;

(5) 轉(zhuǎn)換運行符重載聲明形式:operator 類型名();它沒有返回類型,因為類型名就代表了它的返回類型,所以返回類型顯得多余。

(6)一般來說,轉(zhuǎn)換運算符與轉(zhuǎn)換構(gòu)造函數(shù)(即帶一個參數(shù)的構(gòu)造函數(shù))是互逆的,如有了構(gòu)造函數(shù)Test(int),那么最好有一個轉(zhuǎn)換運算符int()。這樣就不必提供對象參數(shù)重載運算符了,如Test a1(1);Test a2(2); Test a3; a3 = a1+a2;就不需要重載+號操作符了,因為對于a1+a2的運算,系統(tǒng)可能會先找有沒有定義針對Test的+號操作符,如果沒有,它就會找有沒有針對Test類轉(zhuǎn)換函數(shù)參數(shù)類型的+號操作符(因為可以將+號運行結(jié)果的類型通過轉(zhuǎn)換函數(shù)轉(zhuǎn)換為Test對象),因為Test類有個int類型的參數(shù),對于int類型有+操作符,所以a1+a2真正執(zhí)行的是Test(int(a1) + int(a2));即Test(3);

(7)對于轉(zhuǎn)換運算符,還有一個需要注意的地方就是,如果A類中有以B為參數(shù)的轉(zhuǎn)換函數(shù)(構(gòu)造函數(shù)),那B中不能有A的轉(zhuǎn)換運算符,不然就存在轉(zhuǎn)換的二義性,如:

class A{A(B&){…}}; class B{ operator A(){…}};

那么以下語句就會有問題:

B b; A(b);//A(b)有就可能是A的構(gòu)造函數(shù),也可以是B的轉(zhuǎn)換運算符

以上就是小編為大家?guī)淼腃++ operator關鍵字(重載操作符)的用法詳解全部內(nèi)容了,希望大家多多支持腳本之家~

相關文章

  • C語言打印正方形實例代碼

    C語言打印正方形實例代碼

    大家好,本篇文章主要講的是C語言打印正方形實例代碼,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Qt數(shù)據(jù)庫應用之實現(xiàn)數(shù)據(jù)的導入與導出

    Qt數(shù)據(jù)庫應用之實現(xiàn)數(shù)據(jù)的導入與導出

    QT中涉及到數(shù)據(jù)庫相關的項目,幾乎都需要將少量的信息數(shù)據(jù)導出到文件保存好,然后用戶可以打開該表格進行編輯,編輯完成后保存,再重新導入到軟件中。所以本文將具體為大家介紹一下這一功能如何實現(xiàn),感興趣的可以跟隨小編一起試一試
    2022-01-01
  • 介紹C語言中tolower函數(shù)的實例

    介紹C語言中tolower函數(shù)的實例

    這篇文章主要介紹了介紹C語言中tolower函數(shù)的實例,本文列出了該函數(shù)的頭文件,功能說明等,以及如何使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言的基本編寫規(guī)范你了解嗎

    C語言的基本編寫規(guī)范你了解嗎

    這篇文章主要為大家介紹了C語言的基本編寫規(guī)范,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++中rapidjson將嵌套map轉(zhuǎn)為嵌套json的講解

    C++中rapidjson將嵌套map轉(zhuǎn)為嵌套json的講解

    今天小編就為大家分享一篇關于C++中rapidjson將嵌套map轉(zhuǎn)為嵌套json的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 一文弄懂C語言EOF

    一文弄懂C語言EOF

    在 C語言中,EOF 是一個宏定義,EOF 常常用于文件的輸入輸出中,當讀取到文件結(jié)束時,會返回 EOF,本文就詳細的介紹一下具體使用方法,感興趣的可以一起來了解一下
    2023-05-05
  • C++如何調(diào)用opencv完成運動目標捕捉詳解

    C++如何調(diào)用opencv完成運動目標捕捉詳解

    OpenCV作為機器視覺開源庫,使用起來非常不錯,這篇文章主要給大家介紹了關于C++如何調(diào)用opencv完成運動目標捕捉的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • C/C++ 讀取16進制文件的方法

    C/C++ 讀取16進制文件的方法

    下面小編就為大家?guī)硪黄狢/C++ 讀取16進制文件的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • c++智能指針unique_ptr的使用

    c++智能指針unique_ptr的使用

    本文主要介紹了c++智能指針unique_ptr的使用,與shared_ptr作用類似,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • QT5編譯使用QFtp的方法步驟

    QT5編譯使用QFtp的方法步驟

    這篇文章主要介紹了QT5編譯使用QFtp的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02

最新評論