簡體   English   中英

操作員超載<

[英]Overload of the operator <<

為什么在以下情況下無需為“ <<”定義重載?

班級

class T{
    int n ;
    int *pn;
public:
    T(int);
    T(const T&);
    T (int [5]);
    ~T();
    int& operator[] (int);
};

主要的

int main()
{
    int tab[5] = {1,2,3,4,5};
    T a = tab;
    for(int i = 0; i < 5; i++)
    cout << a[i] << " ";
    cout << endl;
    T b = a;
    b[1] = 0;
    b[3] = 0;
    for(int i = 0; i < 5; i++)
    cout << b[i] << " ";
    cout << endl;
    return 0;
}

謝謝

在兩種情況下:

cout << a[i] << " ";
cout << b[i] << " ";

T::operator[](int)將被調用,它返回int& std::stream定義operator<<基本類型(包括int ),所以沒有自定義operator<<需要在這種情況下。

您需要重載<<運算符T的情況下,如果你想輸出全班T ,例如

T a(0);
cout << a;

您只將int發送到輸出流。 運營商

int& T::operator[] (int);

返回int& ,所以在行上

cout << a[i] << " ";

cout << b[i] << " ";

您正在使用流的內置運算符int 不需要對類T特殊處理,因為從未將T實例發送到流。

實際上,無法說出是否需要使操作員超載。 這取決於您將如何設計類和使用它。 在主函數中不使用運算符的事實並不意味着該類本身不需要運算符。 例如對於我來說這段代碼

for(int i = 0; i < 5; i++)
cout << a[i] << " ";

不清楚。 什么是魔術數5? 我可以在循環中使用其他數字嗎? 一些構造函數接受int [5]作為參數的事實並沒有說明什么,因為等效的參數定義可以看成是int [10],int []或int *。

因此,不能肯定地說您的班級是否不需要此運算符。

類通常模擬某些行為或某些對象。 目前尚不清楚類的行為(無論是容器還是其他),因此無法說出是否需要運算符。

暫無
暫無

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

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