运算符重载和STL
运算符重载
基础知识
作用:运算符重载使得用户自定义的数据以一种更简洁的方式工作
不能重载的算符 :
. :: .* ?: sizeof
重载运算符函数可以对运算符作出新的解释,但原有基本语义不变:
不改变运算符的优先级
不改变运算符的结合性
不改变运算符所需要的操作数
不能创建新的运算符
成员运算符函数的原型在类的内部声明格式如下:
classX {
//…
返回类型 operator运算符(形参表);
//…
}
在类外定义成员运算符函数的格式如下:
返回类型 X::operator运算符(形参表)
{
函数体
}
在第一个参数需要隐式转换的情形下,使用友元函数重载
运算符是正确的选择
友元函数没有 this 指针,所需操作数都必须在参数表显式
声明,很容易实现类型的隐式转换
C++中不能用友元函数重载的运算符有
= () [] ->
成员运算符函数与友元运算符函数的比较:
(1) 成员运算符函数比友元运算符函数少带一个参数(后置的++、--需要增加一个形参)。
(2) 双目运算符一般可以被重载为友元运算符函数或成员运算符函数,但当操作数类型不相同时,必须使用友元函数。
赋值运算符:
赋值运算符重载用于对象数据的复制
operator= 必须重载为成员函数
重载函数原型为:
类名 & 类名 :: operator= ( 类名 ) ;
重载函数调用符 () :
重载格式 类型 类 :: operator() ( 参数表 ) ;
例
设 x 是类 X 的一个对象,则表达式
x ( arg1, arg2, … )
可被解释为
x . operator () (arg1, arg2, … )
重载流插入和流提取运算符:
istream 和 ostream 是 C++ 的预定义流类
cin 是 istream 的对象,cout 是 ostream 的对象
运算符 << 由ostream 重载为插入操作,用于输出基本类型数据
运算符 >> 由 istream 重载为提取操作,用于输入基本类型数据
用友元函数重载 << 和 >> ,输出和输入用户自定义的数据类型
重载输出运算符“<<”(只能被重载成友元函数,不能重载成成员函数)
定义输出运算符“<<”重载函数的一般格式如下:
ostream& operator<<(ostream&out,class_name& obj)
{
out<<obj.item1;
out<<obj.item2;
.. .
out<<obj.itemn;
return out;
}
个人感悟:
重载包括成员函数的重载和运算符的重载。
通过对成员函数的重载,我们可以使一个函数具有多种行为,能够简化后续的操作,使函数的功能更加丰富,这样做减少了函数名的数量,提高了程序的可读性,可以充分利用系统空间。成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual关键字可有可无。
运算符重载可以使运算符的含义更加丰富,使运算符完成我们期待的运算,可以使用运算符重载完成复杂的运算,很大程度上简化了程序的结构。由于系统默认的运算符运算比较基础,在处理问题时,往往会比较复杂,例如比较两个人的年纪大小,就可以对<>进行重载,使它完成对age的比较。重载不能改变运算符的基本属性,默认的参数不能和重载运算符一起使用。
STL
基础知识:
STL是C++标准程序库的核心,深刻影响了标准程序库的整体结构
STL内的所有组件都由模板(template)构成,其元素可以是任意类型
STL是所有C++编译器和所有操作系统平台都支持的一种库
STL组件
容器(Container)-管理某类对象的集合
迭代器(Iterator)-在对象集合上进行遍历
算法(Algorithm)-处理集合内的元素
容器适配器(container adaptor)
函数对象(functor)
STL容器的共同能力
所有容器中存放的都是值而非引用。如果希望存放的不是副本,容器元素只能是指针。
所有元素都形成一个次序(order),可以按相同的次序一次或多次遍历每个元素
STL容器元素的条件
必须能够通过拷贝构造函数进行复制
必须可以通过赋值运算符完成赋值操作
必须可以通过析构函数完称销毁动作
序列式容器元素的默认构造函数必须可用
某些动作必须定义operator ==,例如搜寻操作
关联式容器必须定义出排序准则,默认情况是重载operator <
STL容器的共同操作
赋值(assignment)和交换(swap)
swap用于提高赋值操作效率
与迭代器(iterator)相关的操作
begin()-返回一个迭代器,指向第一个元素
end()-返回一个迭代器,指向最后一个元素之后
rbegin()-返回一个逆向迭代器,指向逆向遍历的第一个元素
rend()-返回一个逆向迭代器,指向逆向遍历的最后一个元素之后
容器的共同操作
元素操作
insert(pos,e)-将元素e的拷贝安插于迭代器pos所指的位置
erase(beg,end)-移除[beg,end]区间内的所有元素
clear()-移除所有元素
vector
vector模拟动态数组
vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public拷贝构造函数和重载的赋值操作符)
必须包含的头文件#include <vector>
vector支持随机存取
vector的大小(size)和容量(capacity)
size返回实际元素个数,
capacity返回vector能容纳的元素最大数量。如果插入元素时,元素个数超过capacity,需要重新配置内部存储器。
map/multimap
使用平衡二叉树管理元素
元素包含两部分(key,value),key和value可以是任意类型
必须包含的头文件#include <map>
根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢
不能直接改变元素的key,可以通过operator []直接存取元素值
map中不允许key相同的元素,multimap允许key相同的元素
个人感悟:
C++标准模板库其实属于C++标准库的一部分,C++标准模板库主要是定义了标准模板的定义与声明,而这些模板主要都是
类模板,我们可以调用这些模板来定义一个具体的类;与之前的自己手动创建一个函数模版或者是类模板不一样,我们使用了
STL就不用自己来创建模板了,这些模板都定义在标准模板库中,我们只需要学会怎么使用这些类模板来定义一个具体的类,
然后能够使用类提供的各种方法来处理数据。