1.递增递减运算符
C++语言并不要求递增递减运算符必须是类的成员。但是因为他们改变的正好是所操作对象的状态,所以建议设定为成员函数。
对于递增与递减运算符来说,有前置与后置两个版本,因此,我们应该为类定义两个版本的递增与递减运算符。
问题来了,程序是如何区分前置和后置呢?因为都是++和-- 为了解决这个问题,后置版本的递增递减运算符接受一个额外的(不被使用)int类型的形参。当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参。这个形参唯一的作用就是区分前置和后置运算符函数。
因为不会用到int形参,所以无须为其命名。
例子如下:
Person & Person::operator++()//前置版本的++ { age++;//only ++ age return *this; } Person & Person::operator--()//前置版本的-- { age--; return *this; } Person & Person::operator++(int)//后置版本的++ { Person &p = *this; age++; return p; } Person & Person::operator--(int)//后置版本的-- { Person &p = *this; age--; return p; }
int main() { Person p1(20, "SCOTT"); Person p2(10, "Kate"); cout << p1 << endl; p1--; cout << p1 << endl; return 0; }
上述代码比较简单,为了方便演示,在我们的Person中只对Person类中的age成员变量进行了递增递减操作。
运行结果:
Init Person
Init Person
p.age: 20, p.name: SCOTT
p.age: 19, p.name: SCOTT
~Person name: 0x8dcc048 age: 10
~Person name: 0x8dcc020 age: 19
2.成员访问运算符
在迭代器类以及智能指针类中常常见到解引用运算符(*) 与 箭头运算符(->) 。我们也可以自定义这两个运算符。
例子:
Person * Person::operator->() { return this; }
Person & Person::operator*() { return *this; }
int main() { Person p1(20, "SCOTT"); Person p2(10, "Kate"); cout << p1->getName() << endl; cout << (*p2).getName() << endl; return 0; }运行结果:
Init Person
Init Person
SCOTT
Kate
~Person name: 0x89d7048 age: 10
~Person name: 0x89d7020 age: 20