C++中一共有两种自增运算符
1、前置自增运算符
2、后置自增运算符

前置自增运算符可以链式使用,而后置自增运算符不可以链式使用

1、重载前置运算符

by 成员函数的方式

  1. #include <iostream>
  2. using namespace std;
  3. class Student{
  4. public:
  5. int m_age;
  6. double m_score;
  7. Student(){
  8. m_age = 19;
  9. m_score = 100.0;
  10. }
  11. Student(const Student& stu){
  12. m_age = stu.m_age;
  13. m_score = stu.m_score;
  14. }
  15. Student& operator++(){ // 这里一定要是返回对象的引用 否则链式使用的时候会出问题
  16. (this->m_age)++;
  17. (this->m_score)++;
  18. return *this;
  19. }
  20. };
  21. ostream& operator<<(ostream& os,const Student& stu){
  22. os << "m_age = " << stu.m_age << endl;
  23. os << "m_soce = " << stu.m_score << endl;
  24. return os;
  25. }
  26. istream& operator>>(istream& is,Student& stu){
  27. cout << "m_age: ";
  28. is >> stu.m_age;
  29. cout << "m_score: ";
  30. is >> stu.m_score;
  31. return is;
  32. }
  33. void test1(){
  34. Student stu;
  35. cin >> stu;
  36. cout << stu;
  37. cout << ++stu << endl;
  38. cout << ++(++stu) << endl; // 可以像这个样子链式使用前置自增
  39. return;
  40. }
  41. int main(){
  42. test1();
  43. system("pause");
  44. return 0;
  45. }

image.png

虽然链式使用了两次自增运算符,但是实际上数据只自增了一次。
原因: 第二次自增的时候,系统重新构造出了一个数据相同的对象。因此,重载前置运算符的时候的返回值一定是对象的引用。

2、重载后置运算符

by 成员函数

  1. #include <iostream>
  2. using namespace std;
  3. class Student{
  4. public:
  5. int m_age;
  6. double m_score;
  7. Student(){
  8. m_age = 19;
  9. m_score = 100.0;
  10. }
  11. Student(const Student& stu){
  12. m_age = stu.m_age;
  13. m_score = stu.m_score;
  14. }
  15. Student& operator++(){
  16. (this->m_age)++;
  17. (this->m_score)++;
  18. return *this;
  19. }
  20. Student operator++(int){
  21. Student tempStudent(*this);
  22. m_age ++;
  23. m_score ++;
  24. return tempStudent;
  25. }
  26. };
  27. ostream& operator<<(ostream& os,const Student& stu){ //重载左移运算符
  28. os << "m_age = " << stu.m_age << endl;
  29. os << "m_soce = " << stu.m_score << endl;
  30. return os;
  31. }
  32. istream& operator>>(istream& is,Student& stu){ // 重载右移运算符
  33. cout << "m_age: ";
  34. is >> stu.m_age;
  35. cout << "m_score: ";
  36. is >> stu.m_score;
  37. return is;
  38. }
  39. void test1(){
  40. //Student stu = *(new Student()); 该方法可以将数据开辟到堆区
  41. Student stu; // 默认构造函数创建对象
  42. cout << stu << endl;
  43. cout << (stu++) << endl;
  44. //cout << (stu++)++ << endl; // 是不允许这样的操作的。
  45. cout << stu << endl;
  46. return;
  47. }
  48. int main(){
  49. test1();
  50. system("pause");
  51. return 0;
  52. }