2013-09-05 108 views
-3

std::basic_ostream是否有超載operator <<接受std::basic_string對象?我正在閱讀cppreference,似乎沒有列出。std :: cout如何打印一個std :: string?

+12

它在'':http://en.cppreference.com/w/cpp/string/basic_string/operator_ltltgtgt –

+2

...這是有道理的,因爲這是你可能會把一個插入覆蓋自定義班級*你*正在設計;在它的頭文件中。基本類型和流緩衝區與'basic_ostream'耦合,但是,它們應該是。 – WhozCraig

回答

3

std命名空間中定義了非成員操作符。見cppreference

+0

「全局」在命名空間'std' :)(http://en.cppreference.com/w/cpp/header/string) –

+0

不,真的,你應該編輯你的答案。一個'std :: operator <<'與全局的'operator <<'不一樣。 –

4

想象一下,您可以創建自己的類,名爲Car,其中包含車牌號碼,引擎的型號/功率以及其他信息。現在,想象一下,您想提供一種很好的方式將您的汽車信息打印到文件或屏幕中。

如果你想使用basic_ostream重載,你沒有運氣,因爲你的類定義沒有超載。您可能會提供print_into_ostream方法或其他一些巧妙的技巧,但您剛剛意識到std::string也沒有適當的過載,並且您仍然可以執行cout << myStr;。快速搜索後,您會發現應用到std::string一個解決方案,您可以用它在你的類是這樣的:

class Car 
{ 
    std::string licence_plate, engine; 
public: 
    // ... other here ... 
    friend ostream& operator<<(ostream& os, const Car& c); 
}; 

ostream& operator<<(ostream& os, const Car& c) 
{ 
    os << c.licence_plate << "-" << c.engine; 
    return os; 
} 

現在你可以使用

cout << myCarObject << endl; 

與任何內置類型。

std::string使用相同的方法,你可以找到文檔here

0

如果你要打印class A的一個對象,你重載<< operator這樣的:

ostream & operator << (ostream & os, A &a) 
{ 
    os << a.data_member; 
} 

std namespace同樣的方式有一個重載運算符,打印string類的對象。

+0

'A'應該是'const'限定的,函數必須返回'os'。 –