由于结构体经常用到,所以对结构体的用法做了一下整理
#include<iostream>
using namespace std;
struct node
{
int x,y;
static const int BASC=10000; //定义静态成员变量
node(int x=0,int y=0):x(x),y(y){} //构造函数
//重载输出流
friend ostream& operator<<(ostream&out,const node &p)
{
out<<p.x<<" "<<p.y<<endl;
return out;
}
//重载输入流,不能为const
friend istream&operator>>(istream&in,node &p)
{
in>>p.x>>p.y;
return in;
}
//重载<,成员函数
bool operator<(const node&p)const
{
return x<p.x;
}
//重载>友元函数
friend bool operator>(const node &a,const node &b)
{
return a.x>b.x;
}
//重载+,调用构造函数
friend node operator+(const node&a,const node&b)
{
return node(a.x+b.x,a.y+b.y);
}
};
int main()
{
int x;
node a(1,2),b(3,4); //初始化
cout<<a<<b;
cout<<(a>b)<<endl<<(a<b)<<endl;
cout<<a+b;
cout<<node::BASC<<endl; //访问结构体的静态成员变量
while(cin>>a)
{
cout<<a;
}
return 0;
}
其中值得注意的是对于流的重载,ostream后的&尽量加上
如果写成这样 ostream operator << (ostream& os, Point& pt)
则:
Point a, b;
cout<<a<<b;
错误,只能写为:
cout<<a;
cout<<b;
原因在于
cout<<a<<b;
相当于:
(cout<<a)<<b;
第一个()中返回cout的临时变量,它可以不可以作为左值。因而错误。
如果写成: ostream& operator << (ostream& os, Point& pt)
则:
cout<<a<<b;
正确,因为它等同于
(cout<<a)<<b;
(acout<<a)返回cout的引用,即就是它自己,它可以再次作为左值。因而能够连着写这个输出流