運算子的過載與STL(C 標準模板

2021-08-20 06:50:33 字數 4357 閱讀 6077

在程式設計過程中,有時候一些運算子的功能已不能滿足我們的需要,這個時候,我們就可以根據自己的需要過載運算子,新增或改變該運算子的功能。在c++中大部分運算子都可以過載,但仍有幾個桀驁不馴的傢伙。

例如:.        .*        ::       ?:       sizeof

當然,運算子的過載也要有一定的「潛規則「,不可能讓你亂來。以下便是運算子過載的限制條件:

(1)不改變運算子的優先順序;

(2)不改變運算子的結合性;

(3)不改變運算子的運算元;

(4)不能建立新的運算子;

運算子的過載可以用成員函式或友元函式來完成。

成員函式格式:

//類內定義:

class l

返回型別 operstor x(形參表)

//類外定義:

返回型別 l::operator x(形參表)                      //x在此處為需要被過載的運算子;

//相對於該類定義的操作

例:#include

class complex

complex(double r,double i)

complex operator + (complex &c2);           //過載+用於複數運算

void display( );

complex complex:: operator + (complex &c2)

void complex::display( )

int main( )

;

time(int,int,int,int);

time(int,int);

void settime(int,int,int,int);

void display();

int getmonth();

int getday();

int gethour();

int getminute();

friend ostream & operator<<(ostream &out,const time &);      //過載輸出流輸出時間;

};ostream & operator<<(ostream &out,const time &date)

;record(int,time,string,int,double);

record(time,string,int,double);

void setrecord(int,time,string,int,double);

void display();

string gettype();

time getdate()

friend ostream & operator<<(ostream &out,record &r);                  //過載輸出流由於輸出記錄;

};ostream & operator<<(ostream &out,record &r)

;user(int,string,string,double,int);                   //賬號,姓名,密碼,餘額,交易記錄數

user(int,string,string,double);                      //賬號,姓名,密碼,餘額

void setuser(int,string,string,double);

void setno(int a);

void setyue(double a);

void setuser(double a);

int getno();

double getyue();

string getmima();

string getname();

friend bool operator<(time,time);           //過載《用於比較時間;

friend bool operator==(time,time);

void display();                     //交易記錄數為0時不顯示

void add(record);               //增加一條記錄

void disrecord(int);             //顯示一條記錄

void disallrecord();            //顯示所有記錄;

void querybytime(time,time);      //通過時間查詢記錄

void querybytype(string);         //通過交易型別查詢記錄

};bool operator<(time t1,time t2)

else}}

注意:=()[]> 不能被友元函式過載;

關於stl

概述:(1)stl

是c++

標準程式庫的核心,深刻影響了標準程式庫的整體結構;

(2)stl

由一些可適應不同需求的

集合類(

collection class

),以及在這些資料集合上操作的

演算法(algorithm

)構成;

(3)stl

內的所有元件都由

模板(template)

構成,其元素可以是

任意型別;

(4)stl

是所有c++

編譯器和所有作業系統平台都支援的一種庫;

元件:容器(container) - 管理某類物件的集合;

迭代器(iterator) - 在物件集合上進行遍歷;

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

容器介面卡(containeradaptor);

函式物件(functor);

容器類別:

序列式容器-排列次序取決於插入時機和位置;

關聯式容器-排列順序取決於特定準則;

此處主要介紹vector(向量),map

vector

初始化:vector《資料型別(可以是使用者自定義的類)>  向量的名稱

生成迭代器(類似指標,有書籍形象的將其比作標籤,用於歷遍元素)

迭代器初始化:vector《資料型別(可以是使用者自定義的類)> const_iterator 迭代器名稱  (唯讀)

vector《資料型別(可以是使用者自定義的類)> iterator 迭代器名稱  (讀、寫)

歷遍元素:

設迭代器的名稱為 iter

for (iter = 向量名.begin();iter !=向量名.end();++iter)

vector部分自帶函式:

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

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

insert(pos(迭代器),e)   在pos位置插入e的副本

push_back(e)   在向量末尾插入e的副本

pop_back()   移除最後乙個元素

clear()   移除所有元素,清空容器

map/multimap(multimap允許key相同的元素)

格式 map/multimap《型別,型別》  名稱

大概是將兩個型別繫結到一起

迭代器與vector相似

map部分自帶函式(大部分與vector的類似)

make_pair(type1,type2) 向map的末尾插入元素

心得:如果說過載運算子是一種可以改變運算子功能,實現需求功能的手段。那麼stl應該就算是乙個標配的工具箱。在寫程式時可以將裡面的東西直接拿出來使用,使我們的**變得更為簡潔。當然,現在對於向量等運用還不算熟練,就像寫atm之前對類與物件似懂非懂,寫完之後感覺很簡單一樣,需要更多的練習才能讓自己對stl了解得更透徹。

運算子過載 賦值運算子的過載

有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...

運算子過載 類的賦值運算子過載

下面介紹類的賦值運算子 1.c 中物件的記憶體分配方式 在c 中,物件的例項在編譯的時候,就需要為其分配記憶體大小,因此,系統都是在stack上為其分配記憶體的。這一點和c 完全不同!千 萬記住 在c 中,所有類都是reference type,要建立類的實體,必須通過new在heap上為其分配空間...

運算子過載限制 不能過載的運算子

1.過載後的運算子必須至少有乙個操作符是使用者定義的型別。2.使用運算子不能違反運算子原來的句法規則。3.不能新建運算子 4.不能過載 sizeof const cast,dynamic cast,reinterpret cast,static cast 5.只能通過成員函式過載的運算子 限制說明 ...