運算符重載的特徵標順序

自己腦洞了一道面試題[smile][smile][smile]:
函數的特徵標有沒有順序關係?
答案是有的!
請看下面這個例子:
//declaration
friend String & operator+(const char * schar, String & st);

//defination
String & operator+(const char * schar, String & st)
{
    char * tempString = new char[strlen(st.str) + strlen(schar) + 1];
    strcpy(tempString, schar);
    strcat(tempString, st.str);
    String * temp = new String(tempString);
    delete [] tempString;
    return *temp;
}

//application
String s1("ZJS");
String s2;
s2 = "My name is " + s1;
如果試一下在申明和定義中交換兩個特徵標的順序,那將編譯不通過
爲什麼呢?
因爲這是友元函數運算符重載,不同於普通的函數,在調用是不是用標準的函數調用格式:function(argument),而是用運算符調用(此處爲:"My name is " + s1),這樣的調用方式,是由編譯器來幫助你完成參數匹配的工作的,如果交換參數順序,編譯器將無法正確匹配,因爲在申明中是以一個常量字符指針和一個類的引用的形式來調用的,編譯器在匹配時,只能按照這種順序進行匹配("My name is " + s1 )。如果要交換特徵標的順序,那只有這樣調用才能匹配成功:s1 + "My name is ",但這又和我們定義這個函數的功能不一致(前面的字符串連接後面的字符串)。
總結一下,其實很多設計都是爲了消除二義性
不管是進行特徵匹配函數定義還是函數調用,只要是可能產生二義性的代碼都應該避免,寫出完美(清晰、乾淨、強壯)的代碼是一個優秀程序員追求的目標。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章