2011-09-20 532 views
8

這可能是一個初學者的問題,並理解cout如何工作可能是關鍵。如果有人可以鏈接到一個很好的解釋,那會很好。 cout<<coutcout<<&cout在Linux x86機器上打印由4分隔的十六進制值。cout << cout和cout <<&cout在C++中有什麼區別?

+0

這是一個人的例子。 http://ideone.com/0FZXZ –

+1

究竟是什麼*是問題? – Puppy

+3

你爲什麼這麼問。這個問題沒有任何意義,他們不是這樣做的邏輯。 –

回答

16

cout << cout相當於cout << cout.operator void *()。這是C++ 11之前用來確定iostream是否處於故障狀態的習慣用法,並在std::ios_base中實現;它通常會返回地址static_cast<std::ios_base *>(&cout)

cout << &cout打印出地址cout

由於std::ios_base是虛擬基類cout,因此它可能不一定與cout連續。這就是爲什麼它打印一個不同的地址。

0

cout<<&cout正在將地址cout傳遞給流。

4

cout << &cout正在通過cout的地址cout

cout << cout正在打印使用其operator void*隱式鑄造coutvoid*指針的值。

+0

鏈接已損壞。 – Destructor

+0

由於找不到合適的替代品,我刪除了該鏈接。謝謝 – GWW

5

cout << cout正在使用內置轉換爲void*存在布爾測試目的。由於某些無意義的原因,您的實現使用了一個4字節的地址到std::cout對象中。在C++ 11中,此轉換已被刪除,並且不應該編譯。

cout << &cout正在打印std::cout對象的地址。

3

如已經陳述的,使用cout << cout提供了一種用於測試布爾(while (some_stream){ ... }等)

它輸出值的void*轉換& COUT + 4,因爲轉換是在基實現完成,並投射到它自己的類型,這是from libstdc++

operator void*() const 
{ return this->fail() ? 0 : const_cast<basic_ios*>(this); } 
相關問題