需要解决的问题:前置和后置的问题?如何解决?
需要增加一个无用参数--->用int去标识当前运算符重载是后置的重载运算,前置的则不需要
前置++
MM operator++()
后置++
MM operator++(int) //需要一个无用参数 充当标记
前置++、后置++运算实现原理
例:对"小芳" 的年龄做++运算
int main()
{
int num = 1;
int result = num++; //result=1 num=2
cout << result << "\t" << num << endl;
result = ++num; //result=3 num=3
cout << result << "\t" << num << endl;
}
/*输出*/
1 2
3 3
用类的成员函数方式实现前置++、后置++
class MM
{
public:
MM(string name, int age) :name(name), age(age) {}
friend ostream& operator<<(ostream& out, MM& object) //运算符重载
{
out<< object.name << object.age << endl;
return out;
}
/*const MM& operator++(int)||MM&& operator++(int)
{
return MM(name,age++); //匿名对象是右值,返回引用,用const修饰||右值引用
}*/
//后置++
MM operator++(int) //需要一个无用参数 充当标记
{
int num = age;
age++;
return MM(name, num);
//上面三行等效下面一行
//return MM(name,age++);
}
//前置++
MM operator++()
{
return MM(name, ++age); //构建一个对象返回,返回的如果不是对象怎么赋值给对象?
}
protected:
string name;
int age;
};
int main()
{
MM mm("小芳", 18); //构造一个对象
cout <<mm<<endl;
MM object = mm++;
cout << object<< mm << endl; //age: 18 mm: 19
object = ++mm; //age: 20 mm: 20
cout << object<< mm << endl;
return 0;
}
/*输出*/
小芳18
小芳18
小芳19
小芳20
小芳20
class MM
{
public:
MM(string name = "", int age = 18) :name(name), age(age) {}
friend ostream& operator<<(ostream& out, const MM& object)
{
out<< object.name << object.age << endl; //不加const不会调用这个重载结果
return out;
}
//后置++
MM operator++(int)
{
return MM(name,age++);
}
//前置++
MM operator++()
{
return MM(name, ++age); //返回临时对象,等效于一个右值(相当于const类型)
}
protected:
string name;
int age;
};
int main()
{
MM mm("小芳", 18);
/*报错:没有与这些操作数匹配"<<"运算符 操作数类型为: std::ostream << MM*/
cout << (mm++) <<endl; //返回常对象
return 0;
}
/*输出*/
小芳 18