簡體   English   中英

重載operator << for ostream語法

[英]Overloaded operator<< for ostream syntax

上個學期我上過一些班級的舊任務。 這是打印出鏈表對象的給定打印功能。 我不明白為什么重載運算符需要兩個參數,一個是os對象。 當我們在main.cpp上打印出實際的鏈表對象時,我們不需要傳遞一個os對象。 另外,為什么它會返回os? 為什么我們不能只使用cout而不是“os <<”?

謝謝!

template <class T>
void List<T>::print(ostream & os) const
{
    os << "<";
    ListNode * curr = head;
    while (curr != NULL) {
        os << " " << curr->data;
        curr = curr->next;
    }
    os << " >";
}



// overloaded operator<<
template <class T>
ostream & operator<<(ostream & os, const List<T> & list)
{
    list.print(os);
    return os;
}

順便問一下這個問題是什么以及它是如何基本的,我將嘗試給出一個非常簡單的(盡管是非正式的,不那么迂腐)的答案。

我不明白為什么重載運算符需要兩個參數,一個是os對象

operator <<是二元運算符。 它有左手側和右手側。 當你寫:

cout << 123;

您正在使用兩個操作數(參數)調用此運算符:左側是“cout”,右側是整數“123”。

當我們在main.cpp上打印出實際的鏈表對象時,我們不需要傳遞一個os對象。

您的打印功能是類的成員函數或運算符。 這將隱含地推斷出粗略地說第一個參數不需要顯式傳遞,因為你已經有了'this'指針來處理你的列表對象。 非成員運算符的情況並非如此,因為您沒有隱式推導出的'this'對象已經用於左側操作數。

當你編寫這樣的代碼時:

my_list.print(cout);

您可以將其視為實際傳遞兩個參數,'my_list'和'cout'。 即使你沒有明確地寫它,你也可以通過'this'及其成員訪問'my_list'。 如果您將print函數編寫為非成員,則情況並非如此,如下所示:

template <class T>
void print(const List<T>& my_list, ostream& os);

您的運營商也不是會員職能。

另外,為什么它會返回os?

返回對ostream的引用是允許我們編寫如下語句的:

cout << "hello " << "world";

首先我們調用operator <<(cout,“hello”)然后給我們另一個ostream引用,然后允許我們繼續調用operator <<(cout,“world”)。 例如,如果它返回void,它將不允許我們在一個語句中兩次調用該運算符,因為我們將嘗試輸出帶有void作為左操作數的“world”。

為什么我們不能只使用cout而不是“os <<”?

cout基本上實現了ostream接口。 ofstream,ostringstream和其他類型的輸出流也是如此。 通過根據所需的基本接口編寫它而不是某些特定的ostream衍生物,您可以允許您編寫的代碼使用stdio流,文件流,流和其他流。 基本上它使您的代碼非常通用和可重用,這是您在實際應該努力做的事情。 在解決多態性的概念時,您將更多地了解這個主題。

因為它是一個全球非成員函數。 使用成員函數版本,第一個參數隱式地是調用對象, this 這意味着你的班級必須始終在左側。 使用非成員函數,它是一個顯式參數; 這樣,您可以指定所需的任何類型,並為無法修改源的類重載運算符(只要至少一個參數是用戶定義的類型)。

你使用os的原因是它適用於文件流和一切(從ostream繼承的任何東西),而不僅僅是cout

它返回os以便您可以對返回值執行更多operator<<調用。 這使得操作符鏈接,如w << x << y << z ,其與operator<<(operator<<(operator<<(w, x), y), z) 如果你返回void或者某些東西,你必須在w << x處停止,因為你無法對void的返回值做任何事情。

我不明白為什么重載運算符需要兩個參數,一個是os對象。 當我們在main.cpp上打印出實際的鏈表對象時,我們不需要傳遞一個os對象。

是的,你做了:當你說cout << x ,你將coutx傳遞給operator<<

另外,為什么它會返回os?

使cout << x << y可能。 這被解析為(cout << x) << y ,即它將y插入到cout << x的返回值中。

為什么我們不能只使用cout而不是“os <<”?

因為有時您希望輸出到另一個流而不是標准輸出。

當我們在main.cpp上打印出實際的鏈表對象時,我們不需要傳遞一個os對象。

是的,你做過......像cout << obj; ,其中cout是os輸出流。

另外,為什么它會返回os? 為什么我們不能只使用cout而不是“os <<”?

這允許鏈接: cout << obj << " " << obj2;

為什么我們不能只使用cout而不是“os <<”?

這會硬連接輸出流,因此您無法寫入文件或任何其他輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM