[英]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.