//參考書:essental c++
第一章 c++編程基礎
class:是用戶自定的數據型別。
Class的定義,一般來說分爲兩部分,分別寫於不同的文件:.h(聲明該class所提供的各種操作行爲)和.cpp(實現內容)。
Namespace:是一種將程序庫名稱封裝起來的方法。避免和應用程序發生命名衝突。
Using namespace std:讓命名空間中的名稱曝光。
Template class機制使程序員得以直到是用template class時才決定真正的數據型別。
Container:Array與vector:
Vector是class template,必須在類名稱之後的括號內指定元素型別,比如:
vector<int> vec(100),由於vector是一個類,所有有很多接口函數可以調用,並且vec是一個對象,有別於定義一個array。
Vector的初始化不同於array。
指針帶來的彈性:
vector<int> *seq_addrs[6]={&fibonacci,&lucas,&pell,&triangular,&square,&pentagoanl};
由於[]的優先級高於*,所以seq_addrs是個array,其元素型別爲vector<int> *,因襲seq_addrs[0]是fibonacci vector的地址。
vector<int> *current_vec=0;
current_vec=seq_addrs[i];//i是指標。current_vec就指向了所要指的地址。
rand()和srand():
srand()提供種子,rand()生成0到種子之間的隨機數。
文件的讀寫:
#include <fstream>
//寫
ofstream outfile("seq_data.txt",ios_base::app);
if(!outfile)
cerr<<......//cerr的輸出沒有緩衝
else
outfile<<...<<...;
//讀
ifstream infile("seq_data.txt");
if(!infile)
...
else
infile>>...
//讀寫
fstream iofile("seq_data.txt",ios_base::in | ios_base::app);
if(!iofile)
...
else
iofile.seekg(0);//追加模式開啓時,文件位置位於尾端,讀時,要定位。
............
第2章 面向過程的編程風格
函數的組成:函數的返回型別,函數名稱,函數的參數列表,函數主體.
函數的申明與定義.
如果函數的返回型別不爲void,那麼它必須在每個可能的退出點上將值返回.
參數傳遞方式:傳值和傳址
當我們調用一個函數時,會在內存中建立起一塊特殊區域,稱爲"程序棧",這塊特殊區域提供了每個函數參數的存儲空間,它也提供函數所定義的每個對象的內存空間---我們將這些對象稱爲局部對象.一旦函數完成,這塊內存就會被釋放掉,或者說是從程序堆棧中被pop出來.
當以傳值方式時,默認情形下其值會被複制一份,成爲參數的局部性定義.和外部的對象沒有關聯.
傳址有引用和指針兩種方式.
當我們以by reference方式傳遞對象當做函數參數,對象本身並不會複製出另一份,複製的是對象的地址,函數中對該對象進行的任何操作,都相當於是對傳入的對象進行間接操作.
把參數聲明爲熱ference的理由是:希望得以直接對所傳入的對象進行修改,爲了降低複製大型對象的負擔.
傳pointer的效果和reference的效果相同:傳遞的是對象地址,而不是整個對象的複製品,唯一的差別在於用法不同。
生存空間(scope)及生存範圍(extent)
除static定義的對象外,函數內定義的對象,只存活於函數執行之際。如果將這些所謂局部對象的地址返回,會導致執行期錯誤。如果以傳值方式返回,返回的乃是對象的複製品,它在函數之外依然存在。
生存空間指對象在程序內的存活區域,生存範圍指存活期。
動態內存管理:堆內存
new 和 delete
默認參數:默認值的決議操作由最右邊開始進行;默認值只能夠指定一次,可以在函數聲明處,亦可以在函數定義處,但不能在兩個地方都指定。但通常放在聲明處。
局部靜態對象;局部靜態對象所處的內存空間,即使在不同的函數調用過程中,依然持續存在。
inline函數:將函數聲明爲inline,表示要求編譯器在每個函數調用點上,將函數的內容展開。這使我們獲得效率上的改善。
inline函數的定義常常被置於頭文件中。
函數重載:
參數表不相同的擁有相同函數名稱的函數。
模板函數(Template Functions):
函數模板將參數表中指定的所有或部分參數的型別信息抽離出來。比如:
template <typename elemType>
void display_message(const string &msg, const vector<elemType> &vec)
{}
使用時:
vector<int> ivec;
string msg;
display_message(msg, ivec);
此時,編譯器會將elemType綁定位int型別,然後產生一份display_message()函數實體。
函數指針:必須指明其所指向之函數的返回值類型及參數表。比如:
cosnt vector<int>* (*seq_ptr)(int);
congst vector<int> *pseq=seq_ptr(pos);
const vector<int>* (*seq_array[])(int)={
fibon_seq,lucas_seq,pell_seq,
triang_seq,square_seq,pent_seq
};
第3章 泛型編程風格
STL由兩種組件構成:容器和操作這些容器類的所謂泛型算法。
序列式容器:vector list
關聯式容器:map set
泛型算法通過函授模板技術,達成“與操作對象之型別相互獨立”的目的。
泛型指針:Iterators
.........
.........
序列式容器:
序列式容器用來維護一組排列有序、型別相同的元素,其中有第一、第二...一次類推,乃至最後一個元素。vector和list
是兩個最主要的序列式容器。vector以一塊連續內存來存放元素。list系以雙向鏈接來存儲內容,而非連續內存。
第三種序列容器是所謂的deque。
map:
map被定義爲一對數值,其中的key通常是個字符串,扮演索引的角色,另一個數值是value。
set:
set由一羣keys組和而成。如果我們想知道某值是否存在於某個集合內,就可以使用set。
第4章 給予對象的編程風格
Class由兩部分組成:一組公開的操作函數和運算符(成員函數),以及一組私有的實現細節。
什麼是構造函數和析構函數?以及拷貝構造函數
何謂mutable和const?
形參是const,保證在函數體內不被修改。
成員函數標註const,並且要在聲明和定義中同時指定,不能修改成員變量。比如:
Class triangular{
Public:
Int len() const {return _len;}//const告訴編譯器不會修改對象的內容
};
然而,用mutable申明的成員變量可以被聲明爲const的成員函數修改。對mutable變量所做的改變不會破壞類對象的常數性。
什麼是this指針?
指向對象自己。
static class member,靜態類成員
用來表示唯一一份可共享的成員,可以在同型的所有對象中被存取。對類而言,靜態類成員只有唯一一份實體,必須在程序代碼文件中提供定義,比如:
Vector<int> triangular::_elems;//置於.cpp文件中,不同於全局變量。
可以指定初始值,比如:int triangular::_elems=8;
Static member function靜態成員函數
一般情形下,成員函數必須通過其類的某個對象調用,這個對象會被綁定致該成員函數的this指針。通過this指針才能存取存儲於每個對象中的非靜態成員變量。
靜態成員函數在“與任何對象都無瓜葛”的情形下被調用。比如:
聲明:class Triangular{
Static bool is_elem(int);
}
調用:(Triangular::is_elem(8))
靜態成員變量和靜態成員函數的關鍵字在實現時不需要重複加上static關鍵字。
運算符重載:
Copy assignment operator:
(未完待續。。。)