c++學習筆記(essential c++)

//參考書:essental c++

第一章       c++編程基礎

 

class:是用戶自定的數據型別。

 

Class的定義,一般來說分爲兩部分,分別寫於不同的文件:.h(聲明該class所提供的各種操作行爲).cpp(實現內容)

 

Namespace:是一種將程序庫名稱封裝起來的方法。避免和應用程序發生命名衝突。

Using namespace std:讓命名空間中的名稱曝光。

 

Template class機制使程序員得以直到是用template class時才決定真正的數據型別。

 

ContainerArrayvector

Vectorclass 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由兩部分組成:一組公開的操作函數和運算符(成員函數),以及一組私有的實現細節。

 

什麼是構造函數和析構函數?以及拷貝構造函數

 

何謂mutableconst

形參是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:

 

(未完待續。。。) 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章