在程式設計過程中,有時候一些運算子的功能已不能滿足我們的需要,這個時候,我們就可以根據自己的需要過載運算子,新增或改變該運算子的功能。在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.只能通過成員函式過載的運算子 限制說明 ...