最近,liuserojQQ群里有童鞋对重载运算符(operator)感到疑惑,下面由我这个菜鸡解释最最最基础的重载(高级的我也不会)
重载运算符,是指将C++指定的运算符的规则重载,常见的运算符有:+、-、*、/、%、.、&、&&、|、||、^、,、!、(、)、
?:、::,sizeof等;
其中不可以可重载五种的有:?:(条件运算符)、::(域名运算符)、&和*(取地址运算符,&有时也作为位运算符)、sizeof(字节运算符);
运算符重载格式:
运算符返回值类型 operator (参数一,参数二){
此处相当于函数体;
}
需要注意的是,=(赋值运算)、++(递增运算)、--(递减运算)等属于一元运算符,只能有
一个参数;其他的运算符只能有两个以内参数;一元运算符我只知道放在参数的前面那种
(++和--我不知道哈),当然运算符的参数除了所有内置类型也可以是自定义类型——结构体
(或类),运算符重载一个非常典型的用法就是结构体做加法,代码如下:
#include <cstdio>
using namespace std;
struct point{
int x;
int y;
};
operator += (point &a,point &b){
a.x+=b.x,a.y+=b.y;
}
point a,b;
int main(){
a.x=2,b.x=3,a.y=5,b.y=7;
a+=b;
printf("%d %d",a.x,a.y);
}
下面是一个错误的重载赋值运算符实例:
#include <cstdio>
using namespace std;
struct point{
int x;
int y;
};
operator = (point &a,point &b){
a.x=b.x,a.y=b.y;
}
point a,b;
int main(){
a.x=2,b.x=3,a.y=5,b.y=7;
a=b;
printf("%d %d",a.x,a.y);
}
没错,会CE,那赋值运算符需要赋值和被赋值的两个参数,怎么办?其实一个就够了:
#include <cstdio>
using namespace std;
struct point{
int x;
int y;
operator = (const point a){
x=a.x,y=a.y;
}
};
point a,b;
int main(){
a.x=2,b.x=3,a.y=5,b.y=7;
a=b;
printf("%d %d",a.x,a.y);
}
赋值运算符只需要给数据赋值的那个东东,最好在结构体或类内定义,否则会麻烦一点,类还要
声明友元(friend)等;
另外,如何用cout一次性输出结构体呢?
#include <iostream>
using namespace std;
struct point{
int x;
int y;
operator = (const point a){
x=a.x,y=a.y;
}
};
ostream& operator << (ostream &out,const point &p){
out<<p.x<<','<<p.y;
return out;
}
point a,b;
int main(){
a.x=2,b.x=3,a.y=5,b.y=7;
a=b;
cout<<a;
}
这个了解一下就行了,其实之所以要using namespace std就是因为cout是通过重载<<
运算符来实现输出的(cin也一样),当然cout和cin还有很多成员函数;
不信,你可以把using namespace std;去掉,scanf和printf照样能工作;
c语言没有名为std的命名空间,所以没有cout和cin,也不能重载运算符
说到输入输出,这里提一句,cin和cout之所以慢,是因为他要先把输入输出的数据存到
缓存区,还要自动识别类型;
而scanf和printf还有兄弟:fscanf,fprintf,sscanf,ssprintf,分别用于
读入/输出 文件或字符串,具体请查阅相关资料,这里不赘述了;
废话说尽,下面给出重载非运算符为阶乘运算符的代码做个示例:
#include <iostream>
using namespace std;
struct point{
short x;
};
unsigned long long operator !(const point a){
unsigned long long s=1;
for(int i=2; i<=a.x; i++) s*=i;
return s;
}
point b;
int main(){
b.x=10;
cout<<!b;
}
参数不能是原来运算符的参数类型哦!(!应该是个模板类型)
希望对大家有所帮助,蟹蟹!
共 2 条回复
那个
辣鸡人就是我棒~