操作符過載 C C 學習筆記

2021-05-03 21:02:32 字數 2251 閱讀 4190

一、什麼是操作符過載?

考慮到類成員操作符過載可以訪問類中的私有變數,但是非類成員過載操作符卻不能很方便的訪問類的私有成員,為了方便起見,我們可以通過使用友元(friend)的方式,方便的訪問類的私有成員。

舉例:class string

注意:friend宣告緊跟在類名之後,而不是放在public、private或protected中,因為友元不是授權類的成員,並且該關鍵字只能出現在類中。

經過上述宣告之後,我們的非類成員過載操作符就可以直接方位string類的私有成員了。當然我們也可以不使用友元,而使通過該類的共有成員函式來間接訪問該類的私有成員也是可以的,內聯函式inline就不錯,效率也不低。

由此看來,宣告友元(friend)主要是為了方便高效的訪問類的私有成員變數。

分析:什麼時候應該使用友元:

(1)       某個類不提供公有的訪問私有成員的函式。

(2)       使用共有成員函式訪問私有成員變數效率比較差時。

友元除了用在非成員的過載操作符外,乙個名字空間函式(比如全域性函式),另乙個在此之前定義的類的成員函式或者乙個完整的類,均可以宣告為某個類的成員。

如下宣告:

class b;

class a

通過上述宣告,類a的成員函式可以訪問所有的類b的私有成員,同樣類b的成員函式可以訪問所有類a的私有成員。

六、類型別物件的隱式型別轉換

我們知道,系統提供的內建型別有隱式型別轉換的功能,實際上我們也可以為自己編寫的類提供隱式型別轉換功能。這樣,當我們在使用這種類的物件時,如果需要,編譯器會自動呼叫該類的型別轉換函式,實現型別轉換功能。

c++提供了這樣一種機制,通過它,每個類都可以定義一組「可被應用在該型別物件上的轉換」

舉例:class smallint

;operator int() ;//型別轉換操作符smallint->int

private:

int value;

}在上例中,操作符int()是乙個轉換函式,它定義了乙個使用者轉換,實現在類型別和轉換函式中指定的型別之間的轉換,本例中,目標型別是int。

經過上面的定義後,smallint物件便可以用在任何可以使用int的地方,例如:

smallint si(3);

si+3.1415926;

這樣,首先呼叫smallint轉換函式,產生int型值3,然後將3變為3.0,和3.1415926相加。

實際上,上面類中定義轉換函式還有乙個好處就是:

省略了為該類定義過載操作符,尤其是過載操作符引數型別多樣時。

1、  轉換函式

格式:operator type( ); //引數必須為空,且( )不能省略,並且無返回值型別。

說明:type表示目標型別,它可以用內建型別,類型別或typedef名取代,但不允許表示陣列,轉換函式必須是類的成員函式,並且不能指定返回型別和參數列。

顯式的強制型別轉換會導致呼叫轉換函式,如果被轉換值的型別是乙個類型別,它有乙個轉換函式,並且該轉換函式的型別是強制轉換所指定的型別,則呼叫這個類的強制轉換函式。

比如:char* tokname=static_cast(tok);//tok表示物件,它所屬的類提供乙個到char*的轉換函式。

2、  用建構函式作為轉換函式

在乙個類的建構函式中,凡是只帶有乙個引數的建構函式,例如smallint的建構函式smallint(int),都定義了一組隱式轉換,把建構函式的引數型別轉換成該類型別。

注意:是將int轉換成smallint型。和前面說的轉換函式功能正好相反。

舉例:void calc(smallint);

int  vi;

calc(vi);

這時,編譯器就會隱式呼叫類smallint的建構函式smllint(int),將vi轉換成smallint物件,然後再將這個物件傳遞給函式calc( )。

可以這樣理解:

這個大括號指出temp這個臨時物件的生命週期。

注意:編譯器不會使用乙個顯式建構函式(關鍵字explicit標誌)來執行隱式型別轉換,但是卻可以使用這樣的建構函式來進行強制轉換(即static_cast<>)。

C C 之 操作符過載

1.成員函式過載操作符 除 外其他操作符都可過載 1 a.雙目操作符宣告格式 class 類名 b.雙目操作符定義格式 返回值型別 類名 operator 型別 c.雙目操作符使用格式 類名 a 類名 b a b 或a.operator b 2 a.單目操作符過載宣告格式 class 類名 b.單目...

C C 過載操作符(二) 過載操作符

用於訪問一組元素中的乙個元素。預設的,陣列是支援下標訪問的。中的下標稱為 索引,key,唯一標誌符 當乙個物件設計用於包含多個元素時,可以過載操作符 比如乙個字串text包含多個元素 每個元素是乙個字串 text txt helloworld char ch text 0 比如在乙個datastor...

c 操作符過載 學習筆記

1.過載的限制 1 過載後的操作符必須至少有乙個運算元是使用者自定義的型別,這可以防止使用者把標準操作符給過載。比如 t operator double a,double b error 2 不能違反原來操作符的句法規則。3 不能定義新的操作符,否則那就不叫過載了。4 不能過載下面的操作符 size...