最近几周我们学习了stl和运算符重载,从中受益很多,但还有很
多不懂的地方,不过我确实是学会了很多,从这几周的学习中下
面是我的一些学习总结:
一 运算符重载
1.重载的限制
重载运算符函数可以对运算符做出新的解释,但原有基本语义
不变:
(1)不改变运算符的优先级
(2)不改变运算符的结合性
(3)不改变运算符所需要的操作数
(4)不能创建新的运算符
2,用成员或友元函数重载运算符 :
(1)一元运算符:
Object op 或 op Object
重载为成员函数,解释为:
Object . operator op ()
操作数由对象Object通过this指针隐含传递
重载为友元函数,解释为:
operator op (Object)
操作数由参数表的参数Object提供
(2)二元运算符:
ObjectL op ObjectR
重载为成员函数,解释为:
ObjectL . operator op ( ObjectR )
左操作数由ObjectL通过this指针传递,右操作数由参数ObjectR
传递
重载为友元函数,解释为:左右操作数都由参数传递
例子:有一个Time类,包含数据成员minute(分)和sec(秒),模
拟秒表,每次走一秒,满60秒进一分钟,此时秒又从0开始算。
要求输出分和秒的值。
class Time
{
public:
Time(){minute=0;sec=0;}
Time(intm,ints):minute(m),sec(s){ }
Time operator++( ); //声明前置自增运算符“++”重载函数
Time operator++(int); //声明后置自增运算符“++”重载函数
private:
intminute;
intsec;
};
Time Time∷operator++( ) //定义前置自增运算符“++”重载函数
{
if(++sec>=60) {
sec-=60; //满60秒进1分钟
++minute;
}
return*this; //返回当前对象值
}
Time Time∷operator++(int) //定义后置自增运算符“++”重载函数
{
Timetemp(*this);
sec++;
if(sec>=60) {
sec-=60;
++minute;
}
returntemp; //返回的是自加前的对象
}
注意:1:成员运算符函数比友元运算符函数少带一个参数(后置的
++、--需要增加一个形参)。
2: 双目运算符一般可以被重载为友元运算符函数或成员运算符
函数,但当操作数类型不相同时,必须使用友元函数。
3:几种特殊情况:
(1)运算符【】和()是二元运算符,只能用成员函数重载,
不能用友元函数重载。
(2)重载输出(输入)运算符只能用友元函数重载。
4:重载运算符[ ]和()
(1)重载下标运算符 []
[] 运算符用于访问数据对象的元素
重载格式: 类型 类 ::operator[] ( 类型) ;
例
设 x 是类 X 的一个对象,则表达式
x[ y ]
可被解释为
x. operator [ ] ( y )
(2)重载函数调用符 ()
() 运算符用于函数调用
重载格式: 类型 类 ::operator() ( 参数表 );
例
设 x 是类 X 的一个对象,则表达式
x( arg1, arg2, … )
可被解释为
x. operator () (arg1, arg2, … )
注意:
运算符[]和()是二元运算符
[]和()只能用成员函数重载,不能用友元函数重载
5.重载输出输入流
cin是 itream的对象,cout是ostream的对象
运算符 <<由ostream重载为插入操作,用于输出基本类型数据
运算符 >>由istream重载为提取操作,用于输入基本类型数据
用友元函数重载<<和>>,输出和输入用户自定义的数据类型
例如:
istream&operator>>(istream&in,class_name&obj)
{
in>>obj.item1;
in>>obj.item2;
. . .
in>>obj.itemn;
return in;
}
注意:
只能被重载成友元函数,不能重载成成员函数
赋值运算符重载用于对象数据的复制
operator=必须重载为成员函数
二 stl模板库
1:STL简介
(1)STL是C++标准程序库的核心,深刻影响了标准程序库的
整体结构。
(2)STL由一些可适应不同需求的集合类(collection
class),以及在这些数据集合上操作的算法(algorithm)构成
(3)STL内的所有组件都由模板(template)构成,其元素可
以是任意类型。
(4)STL是所有C++编译器和所有操作系统平台都支持的一种
库。
2:stl组件
3:STL容器类别
(1)序列式容器——排列次序取决于时机和位置
(2)关联式容器——排列顺序取决于特定准则
4:迭代器
可遍历STL容器内全部或部分元素的对象
指出容器中的一个特定位置
5:容器
(1)vector
vector 为了使用vector,必须包含头文件
vector模拟动态数组
vector的元素可以是任意类型T,但必须具备赋值和拷贝能力
(具有public拷贝构造函数和重载的赋值操作符)
必须包含的头文件#include
vector支持随机存取
vector的大小(size)和容量(capacity)
sie返回实际元素个数,
capacity返回vector能容纳的元素最大数量。如果插入元素时,
元素个数超过capacity,需要重新配置内部存储器
(2)map/multimap
使用平衡二叉树管理元素
元素包含两部分(key,value),key和value可以是任意类型
必须包含的头文件#include
根据元素的key自动对元素排序,因此根据元素的key进行定位
很快,但根据元素的value定位很慢
不能直接改变元素的key,可以通过operator []直接存取元素值
map中不允许key相同的元素,multimap允许key相同的元素
(3)set/multiset
使用平衡二叉树管理元素
集合(Set)是一种包含已排序对象的关联容器。
必须包含的头文件#include
map容器是键-值对的集合,好比以人名为键的地址和电话号
码。相反地,set容器只是单纯的键的集合。当我们想知道某位
用户是否存在时,使用set容器是最合适的。
set中不允许key相同的元素,multiset允许key相同的元素
三 学习心得总结
这两个知识点使代码变得更加简洁明了,在解决ATM的问题上
有很大作用,让我少了很多麻烦。例如:对"<”进行重载实现
了时间类的直接比较,用vector,map, multimap来存储记
录,实现查找等功能。我感觉我还需继续努力,学好这部分知
识!