1、存儲類
4個存儲類說明符:auto、register、extern、static。標(biāo)識符的存儲類說明符可以確定其存儲類、范圍和連接。
分兩類:
自動存儲類——auto和register。
只有變量能作為自動存儲類,函數(shù)的局部變量和參數(shù)通常都是自動存儲類。局部變量默認(rèn)為自動存儲類。
靜態(tài)存儲類——extern和static。
這兩個關(guān)鍵字用來聲明靜態(tài)存儲類變量和函數(shù)的標(biāo)識符。這種變量從程序開始執(zhí)行時就存在。對于變量,程序開始執(zhí)行時就分配和初始化存儲空間;對于函數(shù),從程序開始執(zhí)行時就存在函數(shù)名。
全局變量和函數(shù)名默認(rèn)為extern。用static聲明的局部變量仍然只在定義該變量的函數(shù)中使用,但與自動存儲類變量不同的是,static局
部變量在函數(shù)退出時保持其數(shù)值。下次調(diào)用這個函數(shù)時,static局部變量包含上次函數(shù)退出時的值。注:所有靜態(tài)存儲類的數(shù)字變量都默認(rèn)初始化為0。
全局變量能夠被同一個文件中該變量聲明后的所有函數(shù)訪問。其他文件中的函數(shù)也可以訪問全局變量,但必須在使用前予以聲明,如在一個文件中定義:
int flag;
則在另一個文件中需定義如下:
extern int flag;
才可使用全局變量flag。
說明:存儲類別說明符extern告訴編譯器:變量flag或者稍后定義在同一個文件中,或者在另一個文件中定義。而編譯器不知道flag定義在何
處,因此讓連接程序查找flag,如果沒有找到flag的定義,則發(fā)出錯誤消息,如找到,則指明其位置,從而解決對該變量的引用。對于函數(shù)的引用也是如
此。可以用static關(guān)鍵字來防止定義在其他文件中的函數(shù)(沒有在同一個文件中定義)使用這些全局變量或函數(shù)。
2、enum的聲明
enum Status(CONTINUE,WON,LOST);
Status gameStatus;
默認(rèn)枚舉常量(CONTINUE,WON,LOST)從0開始,增量為1。
enum Months(JAN=1,F(xiàn)EB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC);
也可指定從某個常數(shù)開始,如上例從1開始,增量為1。
3、默認(rèn)參數(shù)
必須是函數(shù)參數(shù)表中最右邊的參數(shù)。
int fun1(int,int=1,int=2); //正確
int fun2(int=1,int); //錯誤
默認(rèn)參數(shù)應(yīng)在函數(shù)名第一次出現(xiàn)是指定,通常在函數(shù)原型中。
4、一元作用域運(yùn)算符 :: 可以在同名局部變量的作用域中訪問全局變量。
5、函數(shù)重載
通過函數(shù)簽名(函數(shù)名和參數(shù)類型的組合,包括參數(shù)個數(shù),類型,順序)來區(qū)別。編譯器用參數(shù)個數(shù)和類型為每個重載函數(shù)編碼(名字改編或名字修飾)。
6、數(shù)組
如果初始化的元素比數(shù)組中的元素少,則其余元素自動初始化為0。所以至少需要初始化第一個元素,才能將其余元素自動初始化為0。但是,如果聲明為static數(shù)組,則在沒有顯式初始化時,便以其將自動初始化為0。
數(shù)組維數(shù)只能用常量聲明,無論是靜態(tài)數(shù)組還是自動數(shù)組。
字符數(shù)組可以用字符串直接量(注:字符串直接量返回指向第一個字符的指針)初始化。
char string1[ ]= " first " ;
字符串 " first " 包含五個字符加一個特殊字符串終止符 ' \0 ' 。故string1的長度為6。
將數(shù)組傳遞給函數(shù):
原型:
void modifyArray(int[ ] , int );
或
void modigyArray(int anyArrayName[ ], int anyVariableName);
C++編譯器將忽略原型中的變量名,上述兩種原型聲明等價。
7、指針
int a;
int *aPtr = &a ;
則&*aPtr和*&aPtr將返回相同的值,即為aPtr的值,可知&和*運(yùn)算符是互逆的。
聲明為const的指針應(yīng)在聲明時初始化(如果是函數(shù)參數(shù),則用傳入函數(shù)的指針初始化)。
結(jié)構(gòu)(類)總是按值調(diào)用,傳遞整個結(jié)構(gòu)(類)的副本。
數(shù)組總是按引用調(diào)用,數(shù)組名就是數(shù)組第一個元素的地址。
sizeof運(yùn)算符作用于數(shù)組名時,返回數(shù)組總共占用的字節(jié)數(shù)。
double realArray[22];
sizeof realArray /sizeof(double); //返回22
char* suit[4]={" Hearts ", " Diamonds ", " Clubs ", " spades "};
suit中的數(shù)組元素存放每個字符串的首字母的地址,因此suit是定長的。
所以sizeof suit將返回16(如果單個地址占用4字節(jié))。
8、函數(shù)指針
函數(shù)指針包含函數(shù)在內(nèi)存中的地址。
將函數(shù)指針傳給函數(shù):
原型:
void bubble( int[ ], const int, int ( * ) ( int, int ) );
上述第三個參數(shù)即為函數(shù)指針類型。
看函數(shù)定義:
void bubble( int work[ ], const int size, int ( * compare ) ( int, int ) )
{
( * compare) ( a, b); //a,b為兩個int型的參數(shù)
或者
compare( a, b); //a,b為兩個int型的參數(shù)
}
推薦使用第一種形式,因它顯示說明compare為函數(shù)指針,第二種形式容易認(rèn)為compare是個實際函數(shù)。
函數(shù)指針數(shù)組聲明如下:
void ( * f[ 3 ] )( int )={function1,function2,function3};
上式聲明具3個函數(shù)指針的數(shù)組f。
函數(shù)調(diào)用如下:
(* f[0])(a); //a為int型參數(shù)
9、構(gòu)造函數(shù)與析構(gòu)函數(shù)
一般情況下,析構(gòu)函數(shù)的調(diào)用順序與構(gòu)造函數(shù)相反。
全局范圍中定義的對象的構(gòu)造函數(shù)在文件中的任何其他函數(shù)(包括main)執(zhí)行之前調(diào)用(但不同文件之間全局對象構(gòu)造函數(shù)的執(zhí)行順序是不確定的)。當(dāng)main終止或者調(diào)用exit函數(shù)時調(diào)用相應(yīng)的析構(gòu)函數(shù)。
當(dāng)程序執(zhí)行到對象定義時,調(diào)用自動局部對象的構(gòu)造函數(shù)。該對象的析構(gòu)函數(shù)在對象離開范圍時調(diào)用(即離開定義對象的塊時)。自動對象的構(gòu)造函數(shù)和析構(gòu)函數(shù)在每次對象進(jìn)入和離開范圍時調(diào)用。
static局部對象的構(gòu)造函數(shù)旨在程序執(zhí)行首次到達(dá)對象定義時調(diào)用一次,對應(yīng)的析構(gòu)函數(shù)在main終止或調(diào)用exit函數(shù)時調(diào)用。
可見構(gòu)造函數(shù)調(diào)用順序:
全局對象-〉局部自動(或靜態(tài))對象(按執(zhí)行順序)。
析構(gòu)函數(shù)調(diào)用順序:
局部自動對象-〉main( )執(zhí)行結(jié)束后,靜態(tài)對象(局部或全局)-〉全局對象。
10、關(guān)于成員函數(shù)返回引用
不要讓類的public成員函數(shù)返回對該類private數(shù)據(jù)成員的非const引用(或指針),返回這種引用會破壞封裝。
如:
#include<iostream>
using namespace std;
class Time
{
public:
int getHour();
int &badSetHour(int);
private:
int hour;
int minute;
int second;
};
int Time::getHour()
{
return hour;
}
int &Time::badSetHour(int hh)
{
hour=(hh >= 0 && hh < 24 ) ? hh : 0;
return hour;
}
int main()
{
Time t;
int &hourRef=t.badSetHour(20);
cout<<hourRef<<endl;
hourRef=8;
cout<<t.getHour()<<endl;
t.badSetHour(12) = 5;
cout<<t.getHour()<<endl;
return 0;
}
輸出為:
20
8
5