c++特殊运算符重载

++ --运算符重载

解决问题:前置和后置的问题:增加无用参数 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;
}

 这里我们在定义名字的时候建议用 (_)来区分自带的文本重载

学会上一节的运算符重载与本节的特殊运算符重载,我们就可以自己封装一些带运算符的类了。

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值