结构体成员函数与运算符重载
题单介绍
结构体成员函数:
定义结构体,如果只能定义成员变量的话,那么结构体的用处就没有那么大。用起来也没有那么方便。
当我们对一个结构体做某一个操作时,在外面定义函数,然后把结构体当做参数,是一种可行的方案。
但是这样在函数很多的时候很可能导致函数重名。所以我们可以把一些结构体专用的函数定义在结构体内部。
比如:
```
struct vector{//定义二维向量
int x,y;
void input(){//从屏幕读入两个整数,作为这个向量的x坐标和y坐标
scanf("%d%d",&x,&y);
}
void output(){//输出这个向量到屏幕
printf("%d %d\n",x,y);
}
double length(){//求这个向量的长度
return sqrt(x*x+y*y);
}
};
```
在定义了这3个成员函数后,我们就可以使用了。
比如:
```
vector a;
a.input();//读入两个数,作为a.x和a.y
a.output();//输出a.x和a.y
printf("%lf",a.length());//输出向量a的长度
```
构造函数:
在定义结构体时,无法给它赋初始值。必须定义完后再对其成员变量赋值。
所以引入构造函数,能更方便的给结构体赋初始值。
```
struct vector{//定义二维向量
int x,y;
//构造函数没有返回值,函数名与结构体名字相同
vector(){}//默认的构造函数,不给初始值时什么都不做
vector(int xx,int yy){//若定义时给两个值,那么将其存下
x=xx;
y=yy;
}
};
使用时:
vector p;//不给初始值
vector q(1,2);//定义一个初始值为q.x=1,q.y=2的vector变量
```
结构体运算符重载:
c++中的基本数据类型都是支持多种运算的。比如最简单的四则运算。
而我们用结构体定义的新的数据类型却不支持任何运算,这就显得这种新的数据类型不够好用。
所以,c++还支持定义结构体之间的运算操作。
比如:
```
struct vector{//定义二维向量
int x,y;
//定义加法,其中operator是关键字,不可以改。
//由于加法是二元运算符,所以必须有一个参数
vector operator+(vector b){
vector c;
c.x=x+b.x;
c.y=x+b.y;
return c;
}
//定义内积(点积)
int operator*(vector b){
return x*b.x+y*b.y;
}
//定义数乘
vector operator*(int b){
vector c;
c.x=x*b;
c.y=y*b;
return c;
}
};
使用方法:
vector p,q;
int k;
p+q;//算出向量和
p*q;//算出向量内积
p*k;//算出向量数乘(vector要在前,int要在后)
```