C++學(xué)習(xí)要點(diǎn)總結(jié)(下)
上一篇文章我們已經(jīng)介紹了C++學(xué)習(xí)要點(diǎn)總結(jié)的前半部分C++學(xué)習(xí)要點(diǎn)總結(jié)(上),這篇我們繼續(xù)介紹下半部分:
16. 內(nèi)聯(lián)函數(shù)(inline)在實(shí)現(xiàn)上實(shí)際和宏類似,在內(nèi)聯(lián)函數(shù)出現(xiàn)的地方將函數(shù)展開來避免函數(shù)調(diào)用時(shí)的出棧、如棧,提高效率。但內(nèi)聯(lián)函數(shù)的代價(jià)是:代碼增大。inline函數(shù)適合成員函數(shù)和自由函數(shù)。在類中實(shí)現(xiàn)的函數(shù)自動為內(nèi)聯(lián)函數(shù)。inline必須定義到函數(shù)的實(shí)現(xiàn)上,例如:inline int PlusOne(int) 是無效的。友元函數(shù)在類的體內(nèi)被實(shí)現(xiàn)自動變?yōu)閮?nèi)聯(lián)函數(shù)。
17. #include
- #define DEBUG(X) cout<<#X"="<
其中的#X表示X被當(dāng)作字符串輸出。
18. assert(0 != 0); 如果assert中的條件為假,則運(yùn)行期間回退出程序,且報(bào)告出錯(cuò)代碼的行號。(#include
19. 靜態(tài)對象在main結(jié)束或exit()被調(diào)用時(shí)才調(diào)用自身的析構(gòu)函數(shù)。這意味著,在對象的析構(gòu)函數(shù)中調(diào)用exit()是很危險(xiǎn)的,有可能進(jìn)入一個(gè)死循環(huán)中。調(diào)用abort()來退出函數(shù),靜態(tài)對象的析構(gòu)函數(shù)并不會被調(diào)用。我們可以用atexit()來指定跳出main或調(diào)用exit時(shí)要執(zhí)行的操作,用atexit注冊的函數(shù),可以在所有對象的析構(gòu)函數(shù)之前調(diào)用。
- void exit_fn2(void)
- {
- printf("Exit function #2 called\n");
- } //處理函數(shù)
- atexit(exit_fn2);
20. 全局變量實(shí)際上用的是靜態(tài)存儲。靜態(tài)變量的構(gòu)造是在進(jìn)入main之前調(diào)用的,在main結(jié)束時(shí)調(diào)用它的析構(gòu)函數(shù)。變量的名字由小范圍(c++而言):
- //*.cpp
- int a; //靜態(tài)變量,但為 extern int a; 即它是全局的,外部可見的
- static int b; //靜態(tài)變量,static 和extern相反,只在*.cpp中有效,對其他單元(文件)是不可見的。函數(shù)的定義和上面相同。
- main()
- { }
類的靜態(tài)成員變量可以如下賦值:int X::s=23;(在*.cpp中,無論公私都可以)
21. 名字空間(namespace): 定義一個(gè)名字空間,然后使用unsing就可以將當(dāng)前的類型上下文轉(zhuǎn)換名字空間所定地的.
- namespace math
- {
- enum sign{positive, negative};
- class integer{
- int i;
- sign s;
- public:
- interger(int I=0): i(i) {………}
- sign Sign() {………}
- …………………..
- };//end class
- interger A, B, C;
- interger divide(interger, interger);
- }//no ;
- void q()
- {
- using namespace math;
- interger A; //hides math::A
- A.Sign(negative);
- Math::A.Sign(positive);
- }
22. 一般對于函數(shù)flaot f(int a, int b); 某些c++編譯器編譯后生成_f_int_int的名字,有些c編譯器則生成_f的名字。故在c++中鏈接c的庫函數(shù)時(shí)要用extern “C”告訴編譯器,按c的規(guī)則來編譯函數(shù)。類似的還有extern “C”{#include “myhead.h”},c++還支持extern “C++”{}.
23. 在函數(shù)調(diào)用時(shí),傳引用也是將指針壓棧。
24. 構(gòu)造函數(shù)、析構(gòu)函數(shù)、賦值構(gòu)造函數(shù)、重載的=,四者的調(diào)用順序:(三種函數(shù)都已實(shí)現(xiàn))
a) X x; X a=x;
- result:
- X:construct
- X:copy_struct
b) X x; X a; a=x;
- Result:
- X:construct
- X:construct
- X:copy_stru
- operator =
- X:destruct
如果沒有賦值構(gòu)造函數(shù)則結(jié)果:
- X:construct
- X:construct
- operator =
- X:destruct
(如果直接X a=x;這不掉用一般的構(gòu)造函數(shù),調(diào)用復(fù)制構(gòu)造函數(shù))
指向類的成員函數(shù)的指針:設(shè) int X:: a(void){}
- X x;
- int (X:: *pf)(void)= &X::a;
- (x.*pf)();
指向成員變量的指針: 設(shè)int i; 是X的成員變量
- int X::*pm = &X::i;
- X x;
【編輯推薦】