先看重載:
重載指的是函數的重載,又有成員函數和一般函數的重載,兩者沒什麼差別,隻是地方不一樣而已
函數重載表示函數名相同,但是參數不同,函數重載在C語言裡面是沒有的,隻限定在C++如下所示:
double max(double x,double y),
int max(int x,int y);
這兩個函數就是重載的範例,那麼調用的時候編譯器是如何确定調用哪一個勒?書本上一般說程式會根據參數類型識别調用哪一個,其實那是忽悠人的
實際上在編譯期間,編譯器就已經把函數名字改變了,多加了一些字尾而已(當然說自動識别也不為過)
比如上面兩個程式分别編譯為 max_double_double 和 max_int_int 當然這裡我隻是表示一下,實際上不是這樣,如果要想看看名字,可以通過指令行定位到這個程式,百度上有教程,我就不累述了!
再看重寫:
函數重寫是發生在基類和派生類中的,基類和派生類函數名字必須相同,而且基類函數必須有virtual修飾符,結果是派生類函數覆寫了基類函數,這在C++面向基于對象的程式設計中
已經非常熟悉了,多态就這樣出來了,如下:
Base *p = new Child;
p-> display();
如果派生類重寫了display函數 在這裡就調用派生類的,否則調用基類的!
然後重定義
這個分兩種情況,也是發生在基類和派生類之間
第一種:基類函數不含有vistual修飾符,在派生類中有一個與基類函數同名并且同參數的函數,這個時候基類函數在派生類中被屏蔽了,這種情況叫做一種重定義!
第二種:如果派生類的函數和基類的函數同名,但是參數不同,此時,不管有無virtual,基類的函數被隐藏。
我來解釋下第二種情況,有的人可能會說,我想的就是那樣啊,在派生類中寫一個與基類函數名字相同,但是參數不同的函數,與繼承而來的基類函數構成重載!
相信很多新手會有這種想法(我當初也是),C++ primer上面對這個問題說了,如果是想重載從基類繼承而來的函數,必須手動的從基類複制該函數聲明到派生類中,至于什麼原因,我想又跟編譯器底層有關,這就不去深究了!
最後重定向
其實這個重定向跟函數扯不上關系了,隻是跟前面幾個概念比較相似,他是在IO流處理的時候被提到的。
在C語言中我們知道 一個FILE指針關聯到一個檔案之後,重定向隻需要一個freopen函數即可重新定位一個新的檔案,這叫C語言的重定向
C++中,對流重定向有兩個重載函數:
streambuf* rdbuf () const;
streambuf* rdbuf (streambuf*)
如下:
streambuf *backup;
ifstream fin;
fin.open("data.in");
backup = cin.rdbuf(); // back up cin's streambuf
cin.rdbuf(fin.rdbuf()); // assign file's streambuf to cin
// ... cin will read from file
cin.rdbuf(backup); // restore cin's original streambuf
注意最後我們使用了cin.rdbuf(backup)把cin又重定向回了控制台!
都快6點了,結束了一夜的學習,該睡覺了,頭有點懵了,拖着疲憊的身體寫出來,有些概念沒寫好請體諒!