2013-06-30 47 views
0

這一直困擾我一段時間:與printf,你提供formmatters來指示如何解釋參數,但cout不需要這個。 cout如何知道根據正確的類型讀取變量?cout如何知道如何格式化不同的類型?

+0

哪個編譯器? – hexafraction

+0

它是C++。沒有更多,沒有更多。 'operator <<'是一個函數,它需要參數。參數有類型。這就是'它'知道的。神祕結局。 – sehe

回答

2

它被稱爲函數重載。在C++中,只要具有相同的名稱(operator<<就是這種情況下的名稱),只要它們採用不同的參數集,就可以擁有任意數量的函數。 cout並不指示如何解釋參數,編譯器會這樣做。或者說,編譯器決定調用哪個函數,並且該函數規定參數的格式。編譯器知道每個參數的類型,並相應地調用相應的函數。

例如,這叫ostream::operator<<(int)

cout << 10; 

,這就要求ostream::operator<<(double),這是一個完全不同的功能

cout << 3.14; 
+0

我們可以用ADL來打擾他嗎?說,爲什麼他不需要在工作之前使用std :: operator <<'? sehe

+0

啊,這是有道理的。所以如果你有一個自定義的類,你希望能夠做出決定,那麼你可以簡單地重載<<以你的類作爲參數的定義。 這是一個完全不同的問題哈哈,但是如何在編譯器級別上進行重載? – user2142343

+0

哦,gcc只是使用typeid並且運行了函數已被重載的類型的switch語句? – user2142343