利用operator关键字在对象间进行赋值的几点注意事项(1)
=====================问题提出=====================
众所周知,我们都会用operator关键字来重载原先系统自带的运算符,来达到自己的目的。但是当我们在对象中运用这种方法的时候,我们还是应该考虑下整个程序性能的问题。比如说对于下面这个程序:
#include <iostream> using namespace std; class num { public: num(int i){n=i;cout<<"构造函数正在运行!\n";}//constructor void setNum(int val){n=val;} int getNum() const {return n;} /*void operator++(num i){};*/ void operator++(); private: int n; }; /*void num::operator++(num i)*/ void num::operator ++() { int temp=++n; setNum(temp); } int main() { num i(1); cout<<"对象i的值为"<<i.getNum()<<endl; ++i; cout<<"把i自加后,对象i的值为"<<i.getNum()<<endl; return 0; }
这个程序的作用想必大家都应该很清楚了嘛,就是利用operator将++运算符重载,使之能够适应如程序中第27行的情况。该程序的运行结果很了然:
但是,如果我们把程序里面的第27行换成下面这句话:
num i2=++i;
那么这个程序就会立即报错鸟~~原因其实很简单,我们在这里调用++i其实就是相当于调用下面这句话:
num i2=i.operator++();
而我们清楚的知道,在程序的第11行里面清楚明了地写着,operator++()这个函数返回值为空!所以程序当然会报错了啊!
=====================解决之道=====================
要想解决这个问题,我们其实有三种方法可以选择,一种比一种效率高。下面,我就一种一种地来介绍...
方法1.创建临时对象
这个方法的思路其实很简单,就是把operator++()函数稍微改一下,使它能够传回对象,如下:
#include <iostream> using namespace std; class num { public: num(int i){n=i;cout<<"构造函数正在运行!\n";}//constructor void setNum(int val){n=val;} int getNum() const {return n;} num operator++(); private: int n; }; num num::operator ++() { num temp(0); //创建一个临时对象 ++n; temp.setNum(n); return temp; } int main() { num i(1); cout<<"对象i的值为"<<i.getNum()<<endl; num i2=++i; cout<<"对象i2的值为"<<i2.getNum()<<endl; return 0; }
程序截图:
这种方法的逻辑其实很清楚。我们先把创建一个temp对象,然后再把n自加之后的值传递到temp中,最后返回temp给i2。但是这种方法的效率极其的不高,由于我们知道,创建一个临时对象并且在程序结束的时候销毁它,这样会占用大量的系统资源,这就造成了程序的运行速度减慢,这在某种程度上是不能接受的。那么还有没有什么好的方法可以解决这个问题呢?咱们留到下次再说吧,太困鸟,睡了!