![](/img/trans.png)
[英]What's the difference between using std::cout and using ::std::cout?
[英]What's the relation between `std::cout` and `std::ostream`?
我在某處看到了下面的代碼片段。
#include <iostream>
int main()
{
std::ostream& os = std::cout;
os << "thanks a lot" << std::endl;
return 0;
}
由於上述代碼片段運行良好,這表明std::cout
派生自std::ostream
。 但我還找不到任何直接參考。
根據文件,它說[強調我的]:
全局對象 std::cout 和 std::wcout控制輸出到與標准 C 輸出流 stdout 相關聯的實現定義類型(派生自 std::streambuf)的流緩沖區。
上面的引用說std::cout
控制輸出到從std::streambuf
派生的類型,而不是從std::streambuf
派生的std::cout
。
而且我只在名為/usr/include/c++/7/iostream
的文件中找到std::cout
的聲明:
extern ostream cout; /// Linked to standard output
我找不到std::cout
的實現。
ostream
是一個類。 cout
是該類的一個實例。
這與class Person {}; Person john;
class Person {}; Person john;
. Person
是類, john
是該類的一個實例。 C++ 標准庫恰好提前創建了這個特定類 ( ostream
) 的實例 ( cout
),配置為寫入標准輸出流。
行std::ostream& os = std::cout;
定義了一個名為os
的新變量,它的類型為ostream&
,它是對ostream
的引用。 然后它使其成為對已定義變量cout
的引用。
由於上述代碼片段運行良好,這表明 std::cout 是從 std::ostream 派生的。
不完全的。 該代碼有效,因為std::cout
是std::ostream
。 無需繼承即可閱讀和理解該代碼示例。
上面的引用說
std::cout
控制輸出到從std::streambuf
派生的類型,而不是從std::streambuf
派生的std::cout
。
這句話是在談論您不需要關心的細節(除非您確實關心它們;)。 extern ostream cout;
因為這個問題是ostream cout;
這意味着cout
是ostream
類型的實例(並且extern
只是表明它只是一個聲明,而(實例的)定義在其他地方,何時在 C++ 中使用 extern )。
為了幫助這篇文章的讀者,請參閱下面的代碼片段
#include<iostream>
#include<typeinfo>
int main()
{
std::cout << typeid(std::cout).name() << std::endl;
std::cout << typeid(std::ostream).name() << std::endl;
return 0;
}
這是輸出:
So
So
輸出表明它們是同一類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.