谈谈运算符重载--更加全面了解C++

C++里有一个相当重要的特性--多态,正是这个特性让C++变得更加简洁和直观,而运算符重载作为一种形式的多态,可以让我们更加方便地理解多态

如果对C++有些了解的话,应该知道函数重载,或者称为函数多态,它可以让同名函数对不同数据进行不同处理

而我们把它推演到运算符,一个运算符可以在不同的地方有着不同的作用

*p //p是一个指针
3*4 //3乘以4

这就是所谓的运算符重载

在C++中有一个相当特殊的函数用于运算符重载,它被称为运算符函数,它一般而言为这种形式

operator op (argument)

比如,operator+重载了+,但需要注意的是op必须是C++里有效的运算符,例如@就不能进行重载

所以其实,我们平常对于运算符的使用对于编译器来说,也是一种重载,但不过我们今天所讨论的,将重载拓展到了用户自定义的类型--类中

运算符重载怎么发挥作用

在进行实操前,我们需要了解,运算符重载究竟是怎么工作的

我们假设有一个Student类,我们为它定义operator+()成员函数,方便将其成绩相加,如果src_1,src_2,total,都是Student类的对象,且存在以下语句

total = scr_1 + scr_2;

那么其实这两者其实是等价的

total = scr_1.operator+(src_2);

我们会发现,所谓的运算符重载不过只是一次隐式函数调用

重载!!!

total = scr_1 + 7;
total = 7 + src_1;

total = scr_1.operator+(7);
total = 7.operator+(src_1);

看这些语句,我们可以很容易知道后两者的区别,但对前面两个的差别我们的感知却不明显,按理来说,前面两个理应相等,但实际上,我们把它替换成函数的表达形式,这两个表达式却相差甚远,而且这里有一个很大的问题,7不是一个对象,是不能使用成员函数的

那应该怎么办呢?

对于这种情况,在处理两个数据中只有一个对象时,我们可以利用非成员函数进行重载

是的,除了成员重载以外,我们还可以进行非成员函数重载

所以我们可以重载一个非成员函数进行重载

我们先了解对于非成员函数是如何进行重载的

首先,我们可以知道的是,重载函数需要返回一个类的对象,那么我们不妨假设一个Student类,那么,函数的原型应该是这样的

Student operator+(int a , const Student &t);

对于非成员函数,要重载的运算符前的数值是第一个值,后面的是第二个数值

到这里,我们就可以送一口气了-------吗?

这里有一个很大的问题,非成员函数是不能操作对象的!!!

我们可能会想着把我们需要的数据设为公有不就好了!但是这就违反了类设计的初衷--数据隐藏,那应该怎么办呢?

友元函数

这里我们有一个解决方案,我们引入了一个关键词friend,用于定义需要操作对象的非成员函数,它需要在类声明中进行声明

friend Student operator+(int a , const Student &t);

但需要注意的是,虽然它的原型在类中,但他仍然属于全局函数,是非成员函数,所以在定义时,是不能加上Student::限定符的,同时,在定义时不需要加上friend,该关键词仅仅只用于告诉类这一特殊的函数,所以定义应该是这样

Student operator+(int a , const Student &t){

}

或者,如果在函数声明的时候定义

friend Student operator+(int a , const Student &t){

}

为此我们请看友元函数的示例

 

#include<iostream>
 
class Student
{
	int scr;
	int goal;
 
public:
void set(int a,int b){
	scr = a;
	goal =b;
}  
 
void show(){
	std::cout<< scr;
}
friend Student operator+(int a, Student &t){

Student di;
di.scr = t.scr + a;
return di;


}
 
};
 
int main(){
	
Student abc;
abc.set(40,60);

abc = 5 + abc;
abc.show();


return 0;
}

尾声

非常感谢观看!这可能是我最近一个月最后一次更新了,因为要开学了(笑),我要升高三了(哭),最近在看《Effective C++》和《计算机系统》,对于一些概念渐渐有了些许明朗的认知,有时间的话,我会给大家总结心得!

最近一直在写C++,已经有些时间没有碰Python了,其实我对Python的了解还比C++还深一些的,毕竟好学(笑),我会在回来之后专门开设一个专栏,讨论Python的高级特性和网络爬虫

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值