一道亚信联创笔试题--双目运算符的重载
来源:互联网 发布:川大锦江学院淘宝地址 编辑:程序博客网 时间:2024/04/29 13:39
昨天做了亚信联创实习生的笔试,其中有一道题引发了讨论,代码大概如下:
#include <iostream>using namespace std;class integer{ public: integer(int value=0):value(value){} integer operator+(integer itg) {//双目运算符用成员函数重载 return value+=itg.value;//返回值使用+=符号 } friend ostream& operator<<(ostream& os,integer& it){ return os << it.value; } private: int value;};int main(){ integer i;//i值为0 cout << "i=" << i << endl; integer ii; //ii值为0
ii = i+2;//这里会使得i和ii的值都变成2,因为之前+号重载时使用的return value+=it.value 这种形式 ii = 2+i;//这一行将出现编译错误,因为没有前置加号的形式被重载 cout << "i=" << i << endl; cout << "ii=" << ii << endl; return 0;}
不难发现本身是一个很简单的程序,只是单纯写了一个整形的类,然后输出来,但是题目里面+号运算符重载时使用的成员函数形式的重载,这回导致使用时只能让加号处于变量身后,而不是放在变量之前的问题;错误如图:
其次就是重载+号时,返回值return 使用的value+=it.value,这样会改变当前对象的value值,使得i 和ii的值都变为2,显然这不是我们想要的结果。
实际上,在运算符重载在,友元函数运算符重载函数与成员运算符重载函数的区别是:友元函数没有this指针,而成员函数有,因此,在两个操作数的重载中友元函数有两个参数,而成员函数只有一个。且不能用友元函数重载的符号有:“=,(),[],->”记住,成员函数必须是符号的做操作数。
对于单目运算符,通常用成员函数,来的简便
双目运算符,通常用友元函数,没有操作数左右的限制
对于运算符” =,(),[],->”只能作为成员函数。
于是做修改如下:
#include <iostream>using namespace std;class integer{ public: integer(int value=0):value(value){} /*integer operator+(integer itg) { return value+=itg.value; }*/ friend integer operator+(const integer& a,const integer& b){ return a.value+b.value; } friend ostream& operator<<(ostream& os,const integer& it){ return os << it.value; } private: int value;};int main(){ integer i; cout << "初始值i=" << i << endl; integer ii; ii = i+2; ii = 2+i; cout << "相加之后i=" << i << endl; cout << "ii=" << ii << endl; return 0;}
输出结果:
一切正常。
0 0
- 一道亚信联创笔试题--双目运算符的重载
- 双目运算符的重载
- 双目运算符的重载
- 双目运算符重载
- 重载双目运算符
- 双目运算符重载
- 双目运算符重载
- 双目运算符+=的重载
- C++双目运算符重载
- 10.3 重载双目运算符
- C++之双目/单目等运算符的重载
- C++:运算符重载2(双目:复数的减法)
- 运算符重载的方式 双目运算符重载为类的成员函数
- C++入门 (十) 重载双目运算符
- 运算符重载加法(双目)
- C++之双目运算符重载
- 重载双目/单目运算符
- 重载双目运算符和重载单目运算符
- Bean的作用域
- MATLAB简单优化问题
- Hadoop作业调优参数
- Ubuntu 13.10编译3.13.6内核
- poj 1664 放苹果
- 一道亚信联创笔试题--双目运算符的重载
- 解决eclipse调试程序时source not found的问题
- URL 编码:CFURLCreateStringByAddingPercentEscapes
- 无需安装oracle,配置plsql developer
- QString:: arg()方法
- ubuntu常用软件包deb的安装与卸载
- ofbiz 权限控制语法整理
- [APUE] 线程和fork
- Windows Clear Log