运算符重载
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<len;++i)
v[i]=b[i];
}
ostream& operator<<(ostream &os,const vector &v)
{
for (int i=0;i<len;++i)
os<<v[i]<<" ";
return os;
}
istream& operator>>(istream &is,vector &v)
{
for(int i=0;i<len;++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<key,value>(multimap允许key相同的元素)
格式 map/multimap<类型,类型> 名称
大概是将两个类型绑定到一起
迭代器与vector相似
map部分自带函数(大部分与vector的类似)
make_pair(type1,type2) 向map的末尾插入元素