山中 - 王维
荆溪白石出,天寒红叶稀。
山路元无雨,空翠湿人衣。
- 自增运算符 ++ 会把操作数加 1。
- 自增运算符 ++可以放在操作数的前面(前缀)或后面(后缀)。
- 使用前缀形式(++在操作数的前面),则会在表达式计算之前完成自增或自减。
- 使用后缀形式(++在操作数的后面),则会在表达式计算之后完成自增或自减。
递增运算符重载总结
- 前置自增运算符的重载函数,函数参数是空
- 后置自增运算符的重载函数,多一个没用的参数int
- 前置运算符返回对象的引用
- 后置运算符返回普通对象
前置递增运算符重载
- (++h1) 返回的是自增后 h1 对象,自增后的h1 对象在后续运算过程中,同样会被修改,所以前置运算符的重载函数的返回值必须是引用 &。
code:
#include <iostream>
using namespace std;
class Horse
{
friend void test01(); // 方便测试打印结果
private:
int m_age = 3;
public:
Horse(int age)
{
m_age = age;
}
Horse& operator++() // 必须要返回引用,因为这样才是对原对象的不断累加,才会实现原对象值夜随之改变
{
m_age ++;
return *this;
}
};
void test01()
{
Horse h1(0);
cout << "age: " << h1.m_age << endl;
cout << "age: " << (++(++(++h1))).m_age << endl; // 使用的是自增后的结果
cout << "age: " << h1.m_age << endl;
}
int main()
{
int a1 = 0;
cout << ++(++a1) << endl;
test01();
system("pause");
return 0;
}
result:
2
age: 0
age: 3
age: 3
后置运算符重载
- 后置运算符需要先返回当前值,然后再实现递增,所以要先返回,并且不能返回引用,否则返回的值就是改变后的值。
code:
#include <iostream>
using namespace std;
class Horse
{
friend void test01();
friend void test02();
private:
int m_age = 3;
public:
Horse(int age)
{
m_age = age;
}
Horse& operator++() // 前置, 必须要返回引用, 因为这样才是对原对象的不断累加后的结果,在累加时才会实现原对象值也随之改变
{
m_age ++; // 先自增
return *this; // 返回对象的引用
}
Horse operator++(int) //后置, 必须要利用占位参数来区分为后置,这里先要将当前的对象属性记录下来,最后返回的是记录下来的值,因为后置++是先返回本身值,再进行+1操作
{
Horse result = *this; // 记录++前的结果
m_age++;
return result; // 不能返回局部变量的引用,result的结果是一个临时变量,调用完毕后就释放,如果返回引用会报错
}
};
void test01()
{
Horse h1(0);
cout << "age: " << ++(++(++h1)).m_age << endl; //先对操作数进行累加,再返回,因为返回的是对象引用,一直是对同一个对象在操作
cout << "age: " << h1.m_age << endl;
}
void test02()
{
Horse h1(0);
cout << "age: " << h1.m_age << endl;
cout << "age: " << h1++.m_age << endl; // 后置++无法实现嵌套
cout << "age: " << h1.m_age << endl;
}
int main()
{
int a1 = 0;
cout << ++(++a1) << endl;
test01();
int b1 = 0;
cout << b1++ << endl;
cout << b1 << endl;
//cout << (b1++)++ << endl; //错误语句,后置的自增是无法嵌套的,因为返回值并非是对象本身
test02();
system("pause");
return 0;
}
result:
2
age: 3
age: 3
0
1
age: 0
age: 0
age: 1