操作符函数及重载(3)

前自增减类单目操作符

一.操作数与表达式

•操作数为左值
–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; 
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值