操作员的过载<<

时间:2014-02-12 22:53:20

标签: c++ overloading

为什么不需要为“<<”定义重载有以下情况?

班级

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;
}

由于

3 个答案:

答案 0 :(得分:4)

在这两种情况下:

cout << a[i] << " ";
cout << b[i] << " ";
将调用

T::operator[](int),返回int&std::stream为基本类型定义operator<<(包括int),因此在这种情况下不需要自定义operator<<

如果您要输出整个班级<<,则需要重载T的{​​{1}}运算符,例如

T

答案 1 :(得分:2)

您只是将int发送到输出流。运营商

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

返回int&,行

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

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

您正在使用流的int内置运算符。不需要对类T进行特殊处理,因为没有T的实例发送到流。

答案 2 :(得分:0)

事实上,不可能说你是否需要重载操作员。它取决于你如何设计类并使用它。您不在主函数中使用运算符的事实并不意味着类本身不需要运算符。例如,对于我,然后这个代码

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

尚不清楚。什么是神奇的数字5?我可以在循环中使用其他数字吗?某些构造函数接受作为参数int [5]的事实没有说明,因为等效参数定义可以看作int [10],int []或int *。

所以不能确定你的班级是否需要这个操作员。

类通常模拟某些行为或某些对象。目前尚不清楚你班级的行为是什么(无论是容器还是其他东西),因此无法确定是否需要操作员。