我的隨行筆記7 C++ Primer Plus

qwer1030274531發表於2020-08-31

1.在包含自己的標頭檔案時,應用“ ”而不是< >,如“coordin.h”;  檔名在“ ”中,編譯器將先在當前工作目錄或原始碼目錄中查詢。


  <iostream>, < >表示C++編譯器將在儲存標準標頭檔案的主機系統的檔案系統中查詢。


2. 同一個檔案中只能將同一個標頭檔案包含1次


  #ifndef  COORDIN_H_


 #define COORDIN_H_


....


#endif


3、自動儲存持續性:(自動變數)在函式定義中宣告的變數(包含函式引數)的儲存持續性為自動的,它們在程式開始執行其所屬的函式或程式碼塊時被建立,執行完函式或程式碼塊時,它們使用的記憶體被釋放。自動變數它們佔的記憶體稱為棧,記憶體釋放後,值沒有被刪除,但不在被標記,棧頂恢復到原來的位置。(程式碼塊是指花括號{ }內包含的語句)


靜態儲存持續性:(靜態變數)在函式定義外定義的變數和使用關鍵字static定義的變數的儲存持續性為靜態的,在程式的整個執行過程中都存在。編譯器將分配固定的記憶體來儲存靜態變數。


動態儲存持續性:(動態變數)用new運算子分配的記憶體一直都在,直到用delete運算子將其釋放或程式結束,這種儲存持續性為動態的,有時稱為自由儲存或堆。


4、C++變數的作用域有多種,


  C++函式的作用域可以是整個類或整個名詞空間(包括全域性),但不能是區域性(不能再程式碼塊內定義函式)。


5. int main()


{


int  tel;  ...... //tel #1


{ int  tel;.....  } //tel #2,  在這可{ }程式碼塊中tel #1被隱藏不可見,執行完該程式碼塊後tel #1重新可見。


}


6. 關鍵字register:建議編譯器用CPU暫存器來儲存自動變數。


7.靜態持續變數的3種連結性 


int global=1000;  //global在程式碼塊外宣告,有外部連結性,程式的其他檔案可使用global;


  static int //one_file在程式碼塊外宣告,並用static限定符,有內部連結性,只能在包含上述程式碼的檔案中使用one_file


int main() { ...}


void fun1 (int n){


static int count=0;   //count在程式碼塊內宣告,並用static限定符,無連結性


int lama=0; //靜態變數count和自動變數類似,只能在fun1 ()函式中使用。不同的是即使fun1 ()函式沒有執行count也佔記憶體


}


void fun2 (int q){ ....}


8.未被初始化的靜態變數的所有位都被設定為0;


靜態變數的初始化分為:靜態初始化 和動態初始化。靜態初始化(零初始化和常量表示式初始化)


靜態初始化:編譯後初始化 const double pi=4.0*atan(1.0); 


9. 連結性為外部的變數稱為外部變數。外部變數可以被程式中的多個檔案使用,但每個使用外部變數的檔案都要宣告;但變數只能定義1次。因此有C++的兩種宣告:


定義宣告:(定義)給變數分配儲存空間


引用宣告:(宣告)不分配儲存空間,使用關鍵字extern,不初始化,如果初始化了變為定義,分配儲存空間


extern int blem;  //宣告,blem在其他地方定義


extern char gr='z'; // 定義gr,分配儲存空間    double up; //定義up


10. 用const全域性變數連結性為內部的。但可以用extern關鍵字來覆蓋預設的內部連結性。


extern const int state=34; //有外部連結性


11.所有函式的儲存持續性都是靜態的,預設情況下,函式的連結性都是外部的。可以用extern(也可不用)指出函式在另一個檔案中定義,還可以用static將函式連結性設定為內部,使之只能在一個檔案中使用。


12. 使用new初始化: int * ar=new int[4] {2,6,7,3} ;


 用new和new[] 呼叫函式:


void * operator new(std::size_t) ; //size_t是一個typedef,對應於合適的整型。 釋放函式:void operator delete(void *)


void * operator new[] (std::size_t) ; 釋放函式:void operator delete [] (void *)


定位new運算子:


char buffer[500];


p1=new (buffer) int[20] ;// 將Int陣列放置在buffer。


此時不需要delete [] p1; 因為buffer處於delte管轄之外。


13.建立名稱空間的關鍵詞 namespace, 任何名稱空間中的名稱不會與其他名稱空間的名稱衝突(不同名稱空間可以用相同的名稱)


namespace Jack{ double pail; void fetch(); int pal; } 


訪問名稱空間的名稱用作用域解析運算子 ::  如Jack::pail=12.34;  包含名稱空間的名稱Jack::pail稱為限定名稱


14.using宣告使特定的識別符號可用: using Jack::fetch;  完成該宣告後,在有效區域可用fetch代替Jack::fetch


using編譯指令使整個名稱空間可用:using namespace Jack;名稱空間所有名稱都可用,不用作用域解析運算子 :: 


15.未命名的名稱空間可替代連結性為內部的靜態變數:


函式外宣告:static int counts;


可寫為函式外宣告 : namespace     { int counts; }


16.一個檔案中呼叫average(3,6)函式,返回兩個int引數的int平均值,在同一個程式的另一個檔案中呼叫,它返回返回兩個int引數的double平均值,實現方法:


在每個檔案中包含單獨的靜態函式定義,或每個檔案在未命名的名稱空間(上面的15)中定義一個合適的average()函式


   


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2715931/,如需轉載,請註明出處,否則將追究法律責任。

相關文章