c++隱式轉換帶來的問題
編譯器經常會揹著我們做一些我們不希望發生的事情,最典型的是隱式轉換。不過慶幸的是,編譯器只會幫助我們進行一次轉換,而不會無休止的隱式轉換,直至滿足條件為止。例如,下面先定義乙個array模板類:
templateclass array ;
而在使用中,
arraya[10];
arrayb[10];
for(int i=0;i<10;i++)
}由於書寫錯誤,本來是a[i]==b[i],而出現了上面的a==b[i]。但是編譯器並不會報錯,由於在array模板類中有過載了==操作符,而且引數都為array陣列。在array的建構函式中存在只有乙個int型別的建構函式,因此編譯器會根據b[i],幫我們產生乙個臨時array物件,然後呼叫==操作賦函式。 編譯器沒有報錯,而出現這種情況,可以將建構函式新增乙個宣告:explicit。這樣子編譯器便不能因隱式型別轉換的需要而呼叫它們。編譯器呼叫建構函式幫我們產生需要的物件,但是它只會產生一次,而不會在臨時物件的基礎在呼叫建構函式產生需要的物件。例如:
templateclass array
int size() const
private:
int thesize;
};array(int lowbound,int highbound);
array(arraysize size);
t& operator(int index);
bool operator==(const array& lhs,const array& rhs);
};同樣在使用中出現前面的錯誤,即
arraya[10];arrayb[10];
for(int i=0;i<10;i++)
}編譯器需要乙個array的物件在==的右手邊,得以針對array物件呼叫operator==,但是此刻並沒有「但一自變數,型別為int」的建構函式。同時,編譯器不會考慮將int轉換為乙個臨時性的arraysize物件(這是可行的),然後在根據這個臨時物件產生必要的array物件。即編譯器需要需要做兩件事情:
1、將int轉換為arraysize型別臨時物件;
2、再將arraysize臨時物件轉換為array物件。然後編譯器不會這麼做,而會對上面的**發錯錯誤訊息。幸好編譯器不會做這種事情,否則我們的程式不知道會出現多少潛在的錯誤。不管怎麼樣,隱式轉換總是會帶來隱患。需要小心謹慎!
c 隱式轉換
class string string s1 a 錯誤 不能做隱式char string轉換 string s2 10 可以 呼叫explicit string int n string s3 string 10 可以 呼叫explicit string int n 再呼叫預設的複製建構函式 str...
C 隱式轉換
眾所周知,c 的基本型別中並非完全的對立,部分資料型別之間是可以進行隱式轉換的。所謂隱式轉換,是指不需要使用者干預,編譯器私下進行的型別轉換行為。很多時候使用者可能都不知道進行了哪些轉換。c 物件導向的多型特性,就是通過父類的型別實現對子類的封裝。通過隱式轉換,你可以直接將乙個子類的物件使用父類的型...
C 隱式轉換
include using namespace std class a a int main 程式輸出 constructor destructor a a 10 這樣的語法是通過的,為什麼?由於發生了建構函式的隱式轉換,隱式轉換這樣的規則同意用乙個引數來初始化物件,這會呼叫類中帶有乙個引數的建構函...