C 運算子過載和STL部分學習總結

2021-08-20 07:07:24 字數 4019 閱讀 5846

一, 運算子過載

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傳遞

過載為友元函式,解釋為:

operator op ( objectl, objectr )

左右運算元都由引數傳遞

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, 過載流插入和流提取運算子

(1)istream 和 ostream 是 c++ 的預定義流類

(2)cin 是 istream 的物件,cout 是 ostream 的物件

(3)運算子 << 由ostream 過載為插入操作,用於輸出基本型別資料

(4)運算子 >> 由 istream 過載為提取操作,用於輸入基本型別資料

(5)用友元函式過載 << 和 >> ,輸出和輸入使用者自定義的資料型別 

定義輸出運算子「<<」過載函式的一般格式如下:

ostream& operator<<(ostream& out,class_name& obj)

二, stl

1,stl簡介

(1)stl是c++標準程式庫的核心,深刻影響了標準程式庫的整體結構。

(2)stl由一些可適應不同需求的集合類(collection class),以及在這些資料集合上操作的演算法(algorithm)構成

(3)stl內的所有元件都由模板(template)構成,其元素可以是任意型別。

(4)stl是所有c++編譯器和所有作業系統平台都支援的一種庫。

2,stl元件

容器(container)——管理某類物件的集合

迭代器(iterator)——在物件集合上進行遍

演算法(algorithm)——處理集合內的元素

容器介面卡(container adaptor)

函式物件(functor)

3,stl容器類別

(1)序列式容器——排列次序取決於時機和位置

(2)關聯式容器——排列順序取決於特定準則

stl容器的共同能力

所有容器中存放的都是值而非引用。如果希望存放的不是副本,容器元素只能是指標。

所有元素都形成乙個次序(order),可以按相同的次序一次或多次遍歷每個元素。

stl容器元素的條件

必須能夠通過拷貝建構函式進行複製

必須可以通過賦值運算子完成賦值操作

必須可以通過析構函式完成銷毀動作

序列式容器元素的預設建構函式必須可用

某些動作必須定義operator =,例如搜尋操作

關聯式容器必須定義出排序準則,預設情況是過載operator <(對於基本資料型別(int,long,char,double,……)而言,以上條件總是滿足)

4,stl容器的共同操作

初始化:

產生乙個空容器

(1)以另乙個容器元素為初值完成初始化

(2)以陣列元素為初值完成初始化。

與大小相關的操作

size( )返回當前容器的元素數量

empty( )—判斷容器是否為空

max_size( )—返回容器能容納的最大元素數量。

比較比較操作兩端的容器必須屬於同一型別

如果兩個容器內的所有元素按序相等,那麼這兩個容器相等

採用字典式順序判斷某個容器是否小於另乙個容器

賦值和交換

swap用於提高賦值操作的效率

與迭代器相關的操作

begin()—返回乙個迭代器,指向第乙個元

end()—返回乙個迭代器,指向最後乙個元素之後

rbegin()—返回乙個逆向迭代器,指向逆向遍歷的第乙個元素

rend()—返回乙個逆向迭代器,指向逆向遍歷的最後乙個元素之後

元素操作

insert(pos,e)—將元素e的拷貝安插於迭代器pos所指的位置

erase(beg,end)—移除【beg,end】區間內的所有元素

clear()—移除所有元素

5,迭代器

可遍歷stl容器內全部或部分元素的物件

指出容器中的乙個特定位置

6,容器

重點學習了vector、map/multimap、set/multiset

(1)vector

vector模擬動態陣列

vector的元素可以是任意型別t,但必須具備賦值和拷貝能力(具有public拷貝建構函式和過載的賦值操作符)

必須包含的標頭檔案#include

vector支援隨機訪問

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

size返回實際元素個數,

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相同的元素。

(詳細用法就不在這總結了)

三,學習心得

運算子過載和stl的使用使得**更加的簡潔,同時也方便了很多問題的解決,比如在atm類那個課題中對"<」進行過載實現了時間類的直接比較,用vector,map, 

multimap來儲存記錄,實現查詢等功能。但是stl這部分容器的操作函式以及演算法眾多,有很多掌握的一般,甚至有一些函式和演算法什麼含義都還沒弄明白。對於stl這部分課下還要多多練習!

運算子過載和STL部分的學習總結

在學習類的部分學習完後,我們進行了運算子過載與stl部分的學習。通過這種方式,來進行這部分的總結與複習。一.運算子過載 1.為什麼要過載運算子 c 預定義中的運算子的操作物件只侷限於基本的內建資料型別,但是對於我們自定義的型別 類 是沒有辦法操作的。但是大多時候我們需要對我們定義的型別進行類似的運算...

運算子過載和STL

include using namespace std class printdata public void print int i void setlength double len void setbreadth double bre void setheight double hei 過載 ...

STL 過載運算子

過載運算子 為什麼要過載運算子 c 中預定義的運算子的操作物件只能是基本資料型別。但實際上,對於許多使用者自定義型別 例如結構體 也需要類似的運算操作。這時就必須在c 中重新定義這些運算子,賦予已有運算子新的功能,使它能夠用於特定型別執行特定的操作。運算子過載的實質是函式過載,它提供了c 的可擴充套...