C 進一步認識類與物件

2022-09-24 09:24:08 字數 4202 閱讀 1395

目錄

c++為了增強**的可讀性引入了運算子過載,運算子過載是具有特殊函式名的函式,也具有其返回值型別,函式名字以及引數列表,其返回值型別與引數列表與普通的函式類似。

其函式名為:operator + 需要過載的運算子符號(引數列表)。

需要注意的是:

(1)不能通過連線其他符號來建立新的操作符,比如operator$.也就是說,operator只能過載已有的操作符,其他的符號不能通過該函式來創造。

(2)過載操作符必須有乙個類型別或列舉型別的運算元。

(3)用於內建型別的操作符,其含義不能改變。比如,內建整型的==,不能改變其型別。

(4)運算子過載函式的引數個數為操作符的運算元個數,比如對於==操作符,其運算元由兩個,那麼過載該操作符的函式引數應為2個,即operator==(int x,int y);

(5)對於作為類成員的操作符過載函式,其引數看起來要比操作符的運算元個數少乙個,這是因為函式隱含了乙個形參this,並且this指標被限定為第乙個形參。

(6)語法規定,有五個操作符不能被過載,即.*(成員中指標解引用)、::(作用域限定符)、?:(三目操作符)、.(成員(物件)選擇)、sizeof(長度運算子)。這裡需要注意的是.(解引用操作符)可以被過載,不能被過載的操作符為s1.*ptr中的.*操作符,即訪問類中指標成員並解引用。

用我們熟悉的日期類來舉例,比如我們要實現==這個操作符的過載函式:

//標頭檔案date.h中

class date

; if (month == 2 && year % 4 == 0 && year % 100 != 0 || year % 400 == 0)//閏年二月

return day[month];

} //全預設的建構函式

date(int year = 0, int month = 1, int day = 1) }

void print()

//拷貝建構函式,d1(d2)

date(const date& d)

//==運算子過載

bool operator==(const date& d) const;

private:

int _year;

int _month;

int _day;

};//原始檔date.cpp中

//需要注意,左運算元為this指標指向的呼叫函式的物件,

//即函式等價於bool operator==(date* this, const date d);

bool date::operator==(const date& d) const

由於==操作符的結果為真或假,因此函式的返回值設為bool型別。

我們知道賦值運算子為=,那麼過載賦值運算子的函式應為:

中date& date::operator=(const date& d)

return *this;

}需要注意的是:

(1)首先,為了減少形參拷貝導致的開銷,我們用引用作為形參型別;其次,由於函式並不會修改原運算元,因此加上const可以保證**的安全性。

(2)這裡的*this即this所指向的物件出了這個賦值過載函式並不會銷毀,因此可以用引用返回,返回型別為類名加引用。

(3)如果運算元為兩個相同的物件,回導致賦值操作多餘,因此需要檢查是否出現自己給自己賦值的情況。

乙個類如果沒有顯式定義賦值運算子過載,編譯器也會生成乙個,完成物件按位元組序的淺拷貝(值拷貝)。

以上面的date類為例,在我們不實現賦值操作符過載函式的情況下:

int main()

和拷貝建構函式一樣,編譯器生成的預設賦值過載函式已經可以完成位元組序的值拷貝了,對於date類這樣的我們無需自己定義,但是對於stack這樣會向記憶體申請空間的類,不能直接呼叫編譯器的預設函式,會對已經釋放的空間重複釋放。

賦值過載函式與拷貝建構函式的作用都是實現位元組序的拷貝,那麼二者之間有什麼區別呢?

首先,拷貝建構函式是建構函式的乙個函式過載形式,其函式名為類名,無返回值,而賦值過載函式為=這個操作符的過載,其函式名為operator=,返回值為類名,需要注意的是函式過載與操作符過載二者之間沒有任何關聯。

其次,乙個物件在初始化時呼叫的時拷貝建構函式,而物件初始化完成後再呼叫即為賦值過載函式,比如:

int main()

最後,由於=可以連續使用,因此賦值過載函式可以連續呼叫,比如:

int main()

學習完操作符過載,我們可以實現操作符==、+=、-=、>、等等。

//賦值運算子過載,d2=d3 -> d2.operater=(d3)

date& operator=(const date& d);//由於在類域中this所指向的物件並不會銷毀,因此可以用引用返回

//日期+=天數

date& operator+=(int day);

//日期+天數

date operator+(int day) const;

//日期-=天數

date& operator-=(int day);

//日期-天數

date operator-(int day) const;

//前置++

date& operator++();

//後置++

date operator++(int);

//前置--

date& operator--();

//後置--

date operator--(int);

//==運算子過載

bool operator==(const date& d) const;

//!=運算子過載

inline bool operator!=(const date& d) const;

//>運算子過載

bool operator>(const date& d);

//運算子過載

inline bool operator=運算子過載

inline bool operator>=(const date& d);

//<=運算子過載

inline bool operator<=(const date& d);

//日期 - 日期,返回天數

int operator-(const date& d) const;

我們先來看看下面這個**:

//>運算子過載

bool operator>(const date& d);

void test6()

實際執行過程中會發現d1 > d2這句**編譯不過去,這是因為隱含的this指標預設的型別為不加const修飾的指標型別,而d1的型別為const修飾的變數,因此傳參給this後放大了修改的許可權,導致出現錯誤。但是this指標的型別我們是無法修改的,那麼要怎麼解決這種情況呢?這就需要用到我們接下來要介紹的const修飾類的成員函式了。

將const修飾的類成員函式稱之為const成員函式,const修飾類成員函式,實際修飾該成員函式隱含的this指標,表明在該成員函式中不能對類的任何成員進行修改。

比如說上述**我們可以修改為:

//>運算子過載,其相當於bool operator>(const date* this, const date& d);

bool operator>(const date& d) const;

1.成員函式加const,變成const成員函式,這樣既可以讓const物件呼叫,也可以讓非const物件呼叫。

2.不是所有的成員函式都要加const,因為有的函式需要用this指標修改成員變數。

3.乙個成員函式是否要加const應看其功能,若為修改型,比如operator+=();push();等不需要加const;而對於唯讀型,print();operator+();等就最好加上const。

綜上,如果要修改成員就不加const,若不修改則最好加上const。

類的最後兩個預設成員函式為操作符&的過載及其加上const修飾的函式。

class date

const date* operator&()const

private :

int _year ; // 年

int _month ; // 月

int _day ; // 日

};這兩個運算子一般不需要過載,使用編譯器生成的預設取位址的過載即可,只有特殊情況,oswre才需要過載,比如想讓別人獲取到指定的內容!但在實際過程中應用不多。

本文標題: c++進一步認識類與物件

本文位址: /ruanjian/c/431410.html

溝通,需要進一步認識

溝通,是建立人際關係的橋梁,如果這個世界缺少了溝通,那將是乙個不可想象的世界。可 以這樣說,沒有溝通就沒有人際的互動關係,人與人之間關係,就會處在僵硬 隔閡 冷漠的狀態,會出現誤解 扭曲的局面,給工作和生活帶來極大的害處。資訊 時代的到來,工作 生活節奏越來越快,人與人之間的思想需要加強交流 社會分...

進一步認識HTML(二)

第一種情況 第二種情況 第三種情況 html 三種展示結果如下 當輸入位址出錯時,可用佔位符alt 來介紹資訊 alt 這是帥氣的林志穎和kimi 當滑鼠移動到位置時,則會出現乙個提示。提示符title 做提示 title 這是帥氣的林志穎和kimi 二 標籤 target 三 表單標籤 get p...

進一步使用c

1.簡單程式結構 程式是由函式構成。任何程式都是從main函式開始執行 除個別情況 函式由函式頭和函式體構成。函式頭由函式返回值資料型別,函式名,傳入函式資訊組成。函式體由一系列語句和宣告組成。函式名後的圓括號可識別函式。圓括號裡面可以為空,也可以有引數。變數的宣告內容為,變數資料型別和變數名。函式...