運算子過載的特徵標順序

2021-07-25 15:31:50 字數 906 閱讀 7574

自己腦洞了一道面試題[smile][smile][smile]:

函式的特徵標有沒有順序關係?

答案是有的!

請看下面這個例子:

//declaration

friend string & operator+(const char * schar, string & st);

//defination

string & operator+(const char * schar, string & st)

string s1("zjs");

string s2;

s2 = "my name is " + s1;

如果試一下在申明和定義中交換兩個特徵標的順序,那將

編譯不通過。

為什麼呢?

因為這是友元函式運算子過載,不同於普通的函式,在呼叫是不是用標準的函式呼叫格式:function(argument),而是用運算子呼叫(此處為:"my name is " + s1),這樣的呼叫方式,是由編譯器來幫助你完成引數匹配的工作的,如果交換引數順序,編譯器將無法正確匹配,因為在申明中是以乙個

常量字元指標和乙個

類的引用的形式來呼叫的,編譯器在匹配時,只能按照這種順序進行匹配("my name is " + s1 )。如果要交換特徵標的順序,那只有這樣呼叫才能匹配成功:s1 + "my name is ",但這又和我們定義這個函式的功能不一致(前面的字串連線後面的字串)。

總結一下,其實很多設計都是為了消除

二義性

不管是進行

特徵匹配、

函式定義還是

函式呼叫,只要是可能產生二義性的**都應該避免,寫出完美(清晰、乾淨、強壯)的**是乙個優秀程式設計師追求的目標。

運算子過載 賦值運算子的過載

有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...

運算子過載 類的賦值運算子過載

下面介紹類的賦值運算子 1.c 中物件的記憶體分配方式 在c 中,物件的例項在編譯的時候,就需要為其分配記憶體大小,因此,系統都是在stack上為其分配記憶體的。這一點和c 完全不同!千 萬記住 在c 中,所有類都是reference type,要建立類的實體,必須通過new在heap上為其分配空間...

運算子過載限制 不能過載的運算子

1.過載後的運算子必須至少有乙個操作符是使用者定義的型別。2.使用運算子不能違反運算子原來的句法規則。3.不能新建運算子 4.不能過載 sizeof const cast,dynamic cast,reinterpret cast,static cast 5.只能通過成員函式過載的運算子 限制說明 ...