1. 流插入运算符和流提取运算符的重载
例题:假定c是Complex复数类的对象,现在希望写“cout << c;”,就能以“a+bi”的形式输出c的值,写“cin>>c;”,就能从键盘接受“a+bi”形式的输入,并且使得c.real = a,c.imag = b。
解答:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #include <iostream> #include <string> #include <cstdlib> using namespace std; class Complex { double real, imag;
public: Complex(double r = 0, double i = 0) : real(r), imag(i){}; friend ostream &operator<<(ostream &cout,const Complex &c); friend istream &operator>>(istream &cin, Complex &c); }; ostream &operator<<(ostream &cout, const Complex &c) { cout << c.real << "+" << c.imag << "i"; return cout; } istream &operator>>(istream &cin, Complex &c) { string s; cin >> s; int pos = s.find("+", 0); string sTmp = s.substr(0, pos); c.real = stof(sTmp); sTmp = s.substr(pos + 1, s.length() - 2); c.imag = stof(sTmp); return cin; }
int main() { Complex c,n; cin >> c >> n; cout << c << "," << n; return 0; }
|
输入:
输出结果:
2. 自增、自减运算符的重载和类型转换运算符
但是在没有后置运算符重载而有前置重载的情况下,在vs中,obj++ 也调用前置重载,而dev则令 obj ++ 编译出错
operator int ( ) { return n; }
这里,int 作为一个类型强制转换运算符被重载, 此后
注意:类型强制转换运算符被重载时不能写返回值类型,实际上其返回值类型就是该类型强制转换运算符代表的类型
实际案例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| #include<iostream> using namespace std;
class CDemo { private: int n;
public: CDemo(int i = 0) : n(i) {} CDemo &operator++(); CDemo operator++(int); operator int() { return n; } friend CDemo &operator--(CDemo &); friend CDemo operator--(CDemo &, int); }; CDemo &CDemo::operator++() { n++; return *this; } CDemo CDemo::operator++(int k) { CDemo tmp(*this); n++; return tmp; } CDemo &operator--(CDemo &d) { d.n--; return d; } CDemo operator--(CDemo &d, int) { CDemo tmp(d); d.n--; return tmp; } int main() { CDemo d(5);
cout << (d++) << ","; cout << d << ","; cout << (++d) << ","; cout << d << endl; cout << (d--) << ","; cout << d << ","; cout << (--d) << ","; cout << d << endl; return 0; }
|
-
C++不允许定义新的运算符 ;
-
重载后运算符的含义应该符合日常习惯;
-
运算符重载不改变运算符的优先级;
-
以下运算符不能被重载:“.”、“.*”、“::”、“?:”、sizeof;
-
重载运算符()、[]、->或者赋值运算符=时,运算符重载函数必须声明为类的成员函数。
Harbin Institute of Technology, Shenzhen 计算机科学与技术 本科在读