运算符重载和STL

运算符重载和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&outclass_name& obj)

    {

          out<<obj.item1;

          out<<obj.item2;

          .. .

          out<<obj.itemn;

          return out;

    }

个人感悟:

重载包括成员函数的重载和运算符的重载。
通过对成员函数的重载,我们可以使一个函数具有多种行为,能够简化后续的操作,使函数的功能更加丰富,这样做减少了函数名的数量,提高了程序的可读性,可以充分利用系统空间。成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual关键字可有可无。
运算符重载可以使运算符的含义更加丰富,使运算符完成我们期待的运算,可以使用运算符重载完成复杂的运算,很大程度上简化了程序的结构。由于系统默认的运算符运算比较基础,在处理问题时,往往会比较复杂,例如比较两个人的年纪大小,就可以对<>进行重载,使它完成对age的比较。重载不能改变运算符的基本属性,默认的参数不能和重载运算符一起使用。

 

 

STL

基础知识:

STLC++标准程序库的核心,深刻影响了标准程序库的整体结构

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)-移除[begend]区间内的所有元素

clear()-移除所有元素

vector

vector模拟动态数组

vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public拷贝构造函数和重载的赋值操作符)

必须包含的头文件#include <vector>

vector支持随机存取

vector的大小(size)和容量(capacity

size返回实际元素个数,

capacity返回vector能容纳的元素最大数量。如果插入元素时,元素个数超过capacity,需要重新配置内部存储器。

map/multimap

使用平衡二叉树管理元素

元素包含两部分(key,value)keyvalue可以是任意类型

必须包含的头文件#include <map>

根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢

不能直接改变元素的key,可以通过operator []直接存取元素值

map中不允许key相同的元素,multimap允许key相同的元素

个人感悟:

C++标准模板库其实属于C++标准库的一部分,C++标准模板库主要是定义了标准模板的定义与声明,而这些模板主要都是
类模板,我们可以调用这些模板来定义一个具体的类;与之前的自己手动创建一个函数模版或者是类模板不一样,我们使用了
STL就不用自己来创建模板了,这些模板都定义在标准模板库中,我们只需要学会怎么使用这些类模板来定义一个具体的类,
然后能够使用类提供的各种方法来处理数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值