A .函數探幽:
1. 要使用內聯函數需要做:a. 在函數聲明之前加上關鍵字inline; b.在函數定義前面加上關鍵字inline; 內聯函數的原始實現是宏!
2. 聲明引用時必須進行初始化! (const指針也是在創建時進行初始化)
3. 如何給參數設置默認值?必須通過函數原型。因為編譯器是通過查看原型來了解函數所使用的參數數目,因此函數原型也必須將可能的默認參數告知程序。必須從右向左添加默認值。
4. 函數在重載時,編譯器在檢查函數特征標(參數類型)時,將把類型引用和類型本身視為同一個特征標。匹配函數時,不區分const和非const變量。
B . 內存模型和名稱空間:
1. 不要將函數定義或變量聲明放到頭文件中。為了避免在不知情的情況下將同一頭文件包含多次,可以使用預處理器編譯指令#ifndef,代碼為:#ifndef COORDIN_H_ #define COORDIN_H_ ... #endif
2. 在c++中,可以使用register來聲明局部變量,作用域為局部,沒有鏈接性。因為存儲在寄存器中,沒有內存地址,因此不能使用地址操作符。register int x;
3. 靜態存儲持續性變量(在整個程序執行期間存在)有3種鏈接性:外部鏈接性、內部鏈接性和無鏈接性。下面給出代碼:
int global=1000; //靜態持續變量,外鏈接,在代碼塊的外面聲明
static int one_file=50; //靜態持續變量,內聯接,代碼快外面聲明,并使用static限定符
int main()
{...}
void func1(int n)
{
static int count=0; //靜態持續變量,沒有鏈接性,只能在func1種使用。在代碼塊內聲明,使用static限定符
}
所有的靜態持續變量都有兩個初始化特征:a.未被初始化的靜態變量的所有位都被設為0;b.只能用常量表達式來初始化靜態變量。
對于外部鏈接性變量,有且僅有一個文件中包含了該變量的外部定義,其他文件要使用該變量,必須在引用聲明中使用extern.
4. c++不允許在一個函數中定義另外一個函數,因此所有函數的存儲持續性都自動為靜態的,即在整個程序執行期間都一致存在。默認情況下,函數的鏈接性為外部的。可以用static將函數的鏈接性設置為內部的。
5. 在c++中,同一個名稱可能對應多個函數,在編譯期間,必須為這些函數提供不同的符號名稱。例如可以將spiff(int)轉換為_spiff_i,而將spiff(double,double);轉換為_spiff_d_d,這稱為c++語言鏈接。而extern "c" void spiff(int); 表示以c的語言鏈接性來查找函數。
6. using聲明:假如存在一個名稱空間 namespace Jill{double bucket(double n){...} double fetch;} 則using Jill::fetch;就是一個using聲明。using聲明在函數內時,則聲明的變量是局部的,如果聲明在函數外,則聲明的變量是全局的。
7. using聲明使得一個名稱可用,而using編譯指令使得所有的名稱都可用。 using namespace Jill; 不要在頭文件中使用using編譯指令
C .對象和類:
1. 不用在類中使用private,這是類對象的默認訪問控制。類和結構的唯一區別在于,結構的默認訪問類型是public的。
2. cout和cerr的區別:cout對應于標準輸出流,cerr對應于標準錯誤流; cout可以重定向,cerr不可以;cout要分配緩沖,因此cerr比cout快;它們的 標準默認輸出設備都是屏幕。
3. 類的每個對象都有自己的存儲空間,用于存儲其內部變量;但同一個類的所有對象共享同一組類方法,即每種方法只有一個副本。
4. 默認構造函數是在未提供顯式的初始化值時,被用來創建對象的構造函數。例如:Stock stock1; 當且僅當沒有定義任何構造函數時,編譯器才會提供默認構造函數。為雷定義了構造函數后,程序員就必須為它提供默認構造函數。否則Stock stock1;這樣的聲明將出錯。
5. const成員函數:void show()const; 其對應的定義為void Stock::show()const; 表明在這個類方法中不會修改調用對象。
6. 使類中的某個變量為整個類都可用。a.可以在類中聲明一個枚舉。在類中聲明的枚舉的作用域為整個類,例如: class Stock{ private: enum{Len=30};}; 所有的對象都不包含枚舉!!! b.使用static: class Stack{ private: static const int Len=30;}; 這將創建一個Len常量,該常量不存儲在對象中,而與其他的靜態變量存儲在一起!!