繁体   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