++ --运算符重载
解决问题:前置和后置的问题:增加无用参数 int去表示当前运算符重载是后置操作
文本重载 (新标准中的,稍微落后一点开发工具不适用)
-
其他运算符
-
= () -> [] 只能采用类的成员函数形式重载
-
流重载采用友元方式
-
. (点运算符) .*(点星号运算符) ?:(三目运算符) ::(作用域运算符) 不能重载
-
-
对象隐式转换
- 我们在使用循环的时候,特别会用到前缀加加或者后缀加加操作,但是,我们也可以通过运算符重载来把他应用到对象中
class MM
{
public:
MM(string name, int age) :name(name), age(age) {}
friend ostream& operator<<(ostream& out, MM& object)
{
out << object.name << "\t" << object.age << endl;
return out;
}
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); //小红 18
cout << mm << endl;
++mm;
cout << mm<< endl; //小红 19
mm++;
cout << mm << endl; //小红 20
return 0;
}
- 要注意,上述的两种运算符重载中的参数(int)只是无用参数,用来区分后缀加加与前缀加加,并没有实际作用。后缀减减与前缀减减也是如此
- 接下来是对象隐式转换(很少用)
-
class MM { public: MM(string name, int age) :name(name), age(age) {} friend ostream& operator<<(ostream& out, MM& object) { out << object.name << "\t" << object.age << endl; return out; } //类的对象的隐式转换 operator operator int() { return age; } operator string() { return name; } protected: string name; int age; }; int main() { MM girl("girl", 18); int girlAge = girl; string girlName = girl; cout << girlAge << endl; //打印结果:18 cout << girlName << endl; //打印结果:girl return 0; }
文本重载
- 这是新标准中的重载,版本低一点的可能不适用
- 我们需要记住它的函数定义方式即可
- unsigned long long operator"" (名字)(unsigned long long num)
//文本重载
unsigned long long operator"" _h(unsigned long long num)
{
return 60 * 60 * num;
}
unsigned long long operator"" _min(unsigned long long num)
{
return 60 * num;
}
int main() {
int time1 = 1_h;
cout << time1 << "秒" << endl;
int time2 = 2_h + 39_min + 45;
cout << time2 << "秒" << endl;
/*打印结果:
3600秒
9585秒
*/
return 0;
}
这里我们在定义名字的时候建议用 (_)来区分自带的文本重载
学会上一节的运算符重载与本节的特殊运算符重载,我们就可以自己封装一些带运算符的类了。