运算符可能是成员运算符或非成员运算符,没有多大差异
有时左侧运算符是别的类的对象,通常出现在为输入输出流重载operator<<
和>>时
输入输出流是一个基本C++库,我们将有可能想为定义的大部分类重载运算符
//: C12:IostreamOperatorOverloading.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Example of non-member overloaded operators
#include "../require.h"
#include <iostream>
#include <sstream> // "String streams"
#include <cstring>
using namespace std;
class IntArray {
enum { sz = 5 };
int i[sz];
public:
IntArray() { memset(i, 0, sz* sizeof(*i)); }
int& operator[](int x) {
require(x >= 0 && x < sz,
"IntArray::operator[] out of range");
return i[x];
}
friend ostream&
operator<<(ostream& os, const IntArray& ia);
friend istream&
operator>>(istream& is, IntArray& ia);
};
ostream&
operator<<(ostream& os, const IntArray& ia) {
for(int j = 0; j < ia.sz; j++) {
os << ia.i[j];
if(j != ia.sz -1)
os << ", ";
}
os << endl;
return os;
}
istream& operator>>(istream& is, IntArray& ia){
for(int j = 0; j < ia.sz; j++)
is >> ia.i[j];
return is;
}
int main() {
stringstream input("47 34 56 92 103");
IntArray I;
input >> I;
I[4] = -1; // Use overloaded operator[]
cout << I;
getchar();
} ///:~
这个类还包含重载operator[],这个运算符在数组里返回了一个合法值的引用
被重载的移位运算符通过引用方式传递和返回,所以运算将影响外部对象
在main()中,iostream的一种新类型被使用:stringstream 在<sstream>中声明
程序使用的是插入符和提取符的标准形式
输出
47, 34, 56, 92, -1