运算符重载
C++允许运算符重载,但并不是所有的运算符都支持重载
不能重载的运算符:
. .* :: ?: sizeof
运算符重载后,原有的基本语义不变
1.不改变运算符的优先级
2.不改变运算符的组合性
3.不改变运算符所需要的操作数
语法形式
类型 类名::operator op(参数表)
{
//相对于该类定义的操作
}
例程:
三维坐标类
class TriCoor
{
public:
TriCoor(int mx=0,int my=0,int mz=0);
TriCoor operator+(TriCoor t);
TriCoor& operator++();
TriCoor& operator=(Tricoor t);
private:
int x,y,z;
};
TriCoor::TriCoor(int mx,int my,int mz)
{
x=mx;y=my;z=mz;
}
TriCoor TriCoor::operator+(TriCoor t)
{
TriCoor temp;
temp.x=x+t.x;
temp.y=y+t.y;
temp.z=z+t.z;
}
TriCoor TriCoor::operator++()
{
x++;
y++;
z++;
return *this;
}
TriCoor& TriCoor:: operator=(TriCoor t)
{
x=t.x;
y=t.y;
z=t.z;
return *this;
}
用友元函数重载运算符
例程:
复数计算
class Complex
{
public:
Complex(double r=0,double i=0);
Complex(int a);
{Real =a;Image=0;}
friend Complex operator+(const Complex &c1,const Complex &c2);
friend Complex operator-(const Complex &c1,const Complex &c2);
friend Complex operator-(const Complex &c);
private:
double Real,Image;
};
Complex::Complex(double r,double i)
{
Real=r;
Image=i;
}
Complex operator+(const Complex &c1,const Complex &c2)
{
double r=c1.Real+c2.Real;
double i=c1.Image+c2.Image;
return Complex(r,i);
}
Complex operator-(const Complex &c1,const Complex &c2)
{
double r=c1.Real-c2.Real;
double i=c1.Image-c2.Image;
return Complex(r,i);
}
Complex operator-(const Complex &c)
{
return Complex(-c.Real,-c.Image);
}
重载输出流与输入流
class vector
{
public:
vector(const int*,int);
friend ostream& operator<<(ostream &os,const vector&);
friend istream& operator>>(istream &is,vector&);
private:
int *v;
int len;
};
vector::vector(const int* b,int size)
{
v=new int(size);
len=size;
for(int i=0;i v[i]=b[i]; } ostream& operator<<(ostream &os,const vector &v) { for (int i=0;i os< return os; } istream& operator>>(istream &is,vector &v) { for(int i=0;i is>>v[i]; return is; } STL STL是C++标准模板库,此处主要介绍其中的向量和map; vector 初始化:vector<数据类型(可以是用户自定义的类)> 向量的名称 生成迭代器(类似指针,有书籍形象的将其比作标签,用于历遍元素) 迭代器初始化:vector<数据类型(可以是用户自定义的类)> const_iterator 迭代器名称 (只读) vector<数据类型(可以是用户自定义的类)> iterator 迭代器名称 (读、写) 历遍元素: 设迭代器的名称为 iter for (iter = 向量名.begin();iter !=向量名.end();++iter) vector部分自带函数: begin() 返回一个迭代器,指向第一个元素 end() 返回一个迭代器,指向最后一个元素之后 insert(pos(迭代器),e) 在pos位置插入e的副本 push_back(e) 在向量末尾插入e的副本 pop_back() 移除最后一个元素 clear() 移除所有元素,清空容器 map/multimap 格式 map/multimap<类型,类型> 名称 大概是将两个类型绑定到一起 迭代器与vector相似 map部分自带函数(大部分与vector的类似) make_pair(type1,type2) 向map的末尾插入元素