不能重载的运算符包括 . :: .* ?: sizeof
可重载的运算符包括
+ - * / % ^ & | ~
! = < > += -= *= /= %
^= &= |= << >> >>= <<= == !=
<= >= && || ++ -- ->* ‘ ->
[] () new delete new[] delete[]
重载运算符函数是对运算符的功能进行增加,并且原有的语义不变。1不改变运算符的优先级,。2不改变运算符的结合性。3不改变运算符所需要的操作数。4不能创建新的运算符。
运算符函数可以重载为成员函数或友元函数。
一元运算符:Object op 或 op Object(op为运算符)
重载为成员函数,解释为:Object .operator op () 操作数由对象Object通过this指针隐含传递,因此参数表没有参数。函数调用方式有两种(1)op对象;(2)对象.operator op()。这两种调用方式是等价的。
在类外的定义:返回类型 类名::operator op (形参表){}
重载为友元函数,解释为:operatorop(Object) 操作数由参数表的参数Object提供。
在类外的定义:返回类型 operator op(形参表){}
二元运算符:ObjectL op ObjectR 两个对象来操作
重载为成员函数,解释为:ObjectL .operatorop ( ObjectR ) 左操作数由ObjectL通过this指针传递,右操作数由参数ObjectR传递。函数有两种调用方式(1)对象1op对象2;(2)对象1.operator op(对象2)。这两种调用方式也是等价的。
重载为友元函数,解释为:operatorop (ObjectL, ObjectR ) 左右操作数都由参数传递。
二元运算符在操作数类型不同时,必须使用友元类重载。
友元函数重载运算符常用于运算符的左右操作数类型不同的情况,在第一个参数需要隐式转换的情形下,使用友元函数重载运算符是正确的选择。友元函数没有 this指针,所需操作数都必须在参数表显式声明,很容易实现类型的隐式转换。C++中不能用友元函数重载的运算符有 = () [] ->。
对于几个常用的运算符++ -- = [] () << >>
++和--有前后两种方式,后置或者前置中需要加上int虚参进行区分。
=必须重载为成员函数。
运算符[]和()是二元运算符。[]和()和=一样,只能用成员函数重载,不能用友元函数重载。
<<和>>只能重载为友元函数,下面是类中和类外输入输出运算符的定义。
friend ostream& operator<<(ostream & os,const Date & p2);
friend istream & operator>>(istream & is,Date & p2);
ostream &operator<<(ostream & os,const Date & p2)
{
os<<p2.month<<""<<p2.day<<" "<<p2.hour<<""<<p2.minute;
return os;
}
istream & operator>>(istream & is,Date & p2)
{
is>>p2.month;
is>>p2.day;
is>>p2.hour;
is>>p2.minute;
return is;
}
STL是C++标准程序库的核心,深刻影响了标准程序库的整体结构,由一些可适应不同需求的集合类(collection class),以及在这些数据集合上操作的算法(algorithm)构成,内的所有组件都由模板(template)构成,其元素可以是任意类型,是所有C++编译器和所有操作系统平台都支持的一种库。STL可以用容器(Container)迭代器(Iterator)算法(Algorithm) 三部分概括。
容器的作用是管理某类对象的集合,容器又分为两类1是序列式容器(序列式容器元素的默认构造函数必须可用)2是关联式容器(关联式容器必须定义出排序准则,默认情况是重载operator <)。定义一个空的容器 std::list<int>l; 如果两个容器进行比较的话两个容器的类型必须相同。
迭代器的作用是在对象集合上进行遍历,指出容器中的一个特定位置,要注意的是end()操作是指向最后一个元素之后,而不是最后一个元素。所有容器都提供两种迭代器container::iterator以“读/写”模式遍历元素;container::const_iterator以“只读”模式遍历元素。迭代器分为双向迭代器随机存取迭代器。
算法的作用是处理集合内的元素。
向量vector:
vector的作用和数组类似,但是是动态数组,比数组更加方便,好用。vector的元素可以是任意类型T,但必须具备赋值和拷贝能力。使用vector必须使用头文件#include<vector>。vector的用法包括创建一个空的向量vector<T>c,c.size()返回元素个数,c.push_back(e)在尾部添加一个元素e的副本。c.pop_back()移除最后一个元素但不返回最后一个元素。等等。
map/multimap:
用平衡二叉树管理元素。元素包含两部分(key,value),key和value可以是任意类型,必须包含的头文件#include <map>,根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢,不能直接改变元素的key,可以通过operator []直接存取元素值,map中不允许key相同的元素,multimap允许key相同的元素。
产生一个空的map:map map1; map<string,int>map1;用数组方式对map进行赋值: map1[“a”]=1; map1[“b”]=2;其中map可以是下列形式map<key,value> 一个以less(<)为排序准则的map,map<key,value,op> 一个以op为排序准则的map。map的函数用法和vector差不多。但是map有count(key) 返回”键值等于key”的元素个数,find(key)返回”键值等于key”的第一个元素,找不到返回end函数。这也使得map可以更加方便的在数据中找到需要查询的数据。map还有lower_bound(key)返回”键值大于等于key”的第一个元素,upper_bound(key) 返回”键值大于key”的第一个元素,equal_range(key) 返回”键值等于key”的元素区间。
set/multiset:
使用平衡二叉树管理元素。集合(Set)是一种包含已排序对象的关联容器。必须包含的头文件#include <set>。map容器是键-值对的集合,好比以人名为键的地址和电话号码。相反地,set容器只是单纯的键的集合。当我们想知道某位用户是否存在时,使用set容器是最合适的。set中不允许key相同的元素,multiset允许key相同的元素。set的函数用法和map类似。
算法: