前自增减类单目操作符
一.操作数与表达式
•操作数为左值
–Complex lv (1, 2);
Complex const rv (3, 4);
++lv;
–rv; // 错误
•表达式的值为左值,且为操作数本身(而非副本)
–Complex a (1, 2), b (3, 4);
++++a; // ++(++a)
++a = b; // b->a
二.成员函数
•非常函数以支持左值型操作数,非常返回值以支持左值型表达式的值,返回自引用即操作数本身
–class Complex
{
public:
Complex& operator++ (void)
{
++m_r;
++m_i;
return *this;
}
};
三.全局函数
•非常参数以支持左值型操作数,非常返回值以支持左值型表达式的值,返回引用型参数即操作数本身
–Complex& operator++ (Complex& opd)
{
++opd.m_r;
++opd.m_i;
return opd;
}
后自增减类单目操作符
一.操作数与表达式
•操作数为左值
–Complex lv (1, 2);
Complex const rv (3, 4);
lv++;
rv–; // 错误
•表达式的值为右值,且为操作数在运算前的副本
–Complex a (1, 2), b (3, 4);
a++++; // 错误
a++ = b; // 错误
二.成员函数
•非常函数以支持左值型操作数,常返回值以支持右值型表达式的值,整型哑元参数以区别于前自增减
–class Complex
{
public:
Complex const operator++ (int)
{
Complex old = *this;
++m_r;
++m_i;
return old;
}
};
•对于后自增减表达式,编译器在调用操作符函数时会多传一个整型参数,通过重载解析匹配到后缀操作符函数
–a++; // a.operator++ (0);
–++a; // a.operator++ ();
三.全局函数
•非常参数以支持左值型操作数,常返回值以支持右值型表达式的值,整型哑元参数以区别于前自增减
–Complex const operator++ (Complex& opd, int)
{
Complex old = opd;
++opd.m_r;
++opd.m_i;
return old;
}
•对于后自增减表达式,编译器在调用操作符函数时会多传一个整型参数,通过重载解析匹配到后缀操作符函数
–a++; // ::operator++ (a, 0);
–++a; // ::operator++ (a);
输入输出操作符重载
输出操作符
一.操作数与表达式
•左操作数为左值形式的输出流(ostream)对象,右操作数为左值或右值
–Complex lv (1, 2);
Complex const rv (3, 4);
cout << lv;
cout << rv;
•表达式的值为左值,且为左操作数本身(而非副本)
–Complex complex (1, 2);
cout << complex << endl;
–cout.operator<< (comlex).operator<< (endl);
::operator<< (::operator<< (cout, complex), endl);
二.全局函数
•左操作数的类型为ostream,若以成员函数形式重载该操作符,就应将其定义为ostream类的成员,
该类为标准库提供,无法添加新的成员,因此只能以全局函数形式重载该操作符
•非常第一参数以支持左值型左操作数,常第二参数以支持右值型右操作数,非常返回值以支持左值型表达式的值,
返回引用型第一参数即左操作数本身
–ostream& operator<< (ostream& lhs, Complex const& rhs)
{
return lhs << rhs.m_r << '+' << rhs.m_i << 'i';
}
输入操作符
一.操作数与表达式
•左操作数为左值形式的输入流(istream)对象,右操作数为左值
–Complex lv (1, 2);
Complex const rv (3, 4);
cin >> lv;
cin >> rv; // 错误
•表达式的值为左值,且为左操作数本身(而非副本)
–Complex c1, c2;
cin >> c1 >> c2;
–cin.operator>> (c1).operator>> (c2);
::operator>> (::operator>> (cin, c1), c2);
二.全局函数
•左操作数的类型为istream,若以成员函数形式重载该操作符,就应将其定义为istream类的成员,
该类为标准库提供,无法添加新的成员,因此只能以全局函数形式重载该操作符
•非常第一参数以支持左值型左操作数,非常第二参数以支持左值型右操作数,非常返回值以支持左值型表达式的值,返回引用型第一参数即左操作数本身
–istream& operator>> (istream& lhs, Complex& rhs)
{
return lhs >> rhs.m_r >> rhs.m_i;
}