#include <iostream> using namespace std; class num { public: num(){n = 1;} ~num(){} int get()const{return n;} void set(int i){n = i;} void operator++(){++n;} private: int n; }; int main() { num i; cout << "i:" << i.get() << endl; ++i;//注意这里仅仅是对i变量进行操作让i成员改变了,但是它是没有返回值的, //++i实际上是调用了operator函数,但是operator函数是void类型,所以不能把++i赋给另一个对象 cout << "i:" << i.get() << endl; }
我们知道,不能把++i赋给另一个新建的对象,因为++i调用的是operator函数,这个函数的返回值是void类型的,但是我们把operator的类型改为num类型的并返回一个对象的时候,就能把++i赋给另一个对象了
#include <iostream> using namespace std; class num { public: num(){n = 1;} ~num(){} int get()const{return n;} void set(int i){n = i;} num operator++(){++n; num t; t.set(n); return t;}
//这样返回一个对象的时候需要另外创建一个对象,仍然不太好,我们可以定义一个带参数的构造函数,比如num(int i){n = i;} ,然后在这个函数里return num(n)即可 private: int n; }; int main() { num i; cout << "i:" << i.get() << endl; ++i; cout << "i:" << i.get() << endl; num j = ++i; cout << "i:" << i.get() << endl; cout << "j:" << j.get() << endl; return 0; }
还可以优化代码减少构造函数和复制构造函数的调用,节省时间
#include <iostream> using namespace std; class A { public: void set(int n){i = n;} A(){cout << "构造" << endl;} A(A&s){i = s.i; cout << "复制" << endl;} ~A(){cout << "析构" << endl;} int get(){return i;} void add() {i++;} A& operator++(){++i;return *this;} private: int i; }; int main() { A a; a.set(5); cout << a.get() << endl; a.add(); cout << a.get() << endl; A &n = ++a; cout << n.get() << endl; return 0; }