第一點,使用全域性物件的建構函式在程式啟動前呼叫函式
有一些應用程式需要在主程式啟動前呼叫其它函式。如:轉態過程函式、登記
功能函式都是必須在實際程式執行前被呼叫的。最簡單的辦法是通過乙個全域性物件
的建構函式來呼叫這些函式。因為全域性物件都是在主程式開始前被構造,這些函式
都將會在main()之前返回結果。如:
class logger
}; logger log; //乙個全域性例項
int main()
全域性物件log在main()執行之前被構造,log呼叫了函式activate_log()。從
而,當main()開始執行時,它就可以從log檔案中讀取資料
第二點:指向成員的指標
乙個類有兩種基本的成員:函式成員和資料成員。同樣的,指向成員的指標也
有兩種:指向函式成員的指標和指向資料成員的指標。後則其實並不常用,因為類
一般是不含有公共資料成員的,僅當用在繼承用c寫的**時協調結構(struct)和
類(class)時才會用到。
指向成員的指標是c++語法中最難以理解的構造之一,但是這也是乙個c++最強
大的特性。它可以讓你呼叫乙個類的函式成員而不必知道這個函式的名字。這乙個
非常敏捷的呼叫工具。同樣的,你也可以通過使用指向資料成員的指標來檢查並改
變這個資料而不必知道它的成員名字。
指向資料成員的指標
儘管剛開始時,指向成員的指標的語法會使你有一點點的迷惑,但你不久會發
現它其實同普通的指標差不多,只不過是*號的前面多了::符號和類的名字,例:
定義乙個指向int型的指標:
int * pi;
定義乙個指向為int型的類的資料成員:
int a::*pmi; //pmi是指向類a的乙個int型的成員
你可以這樣初始化它:
class a
; int a::*pmi = & a::num;
上面的**是宣告乙個指向類a的乙個int型的num成員並將它初始化為這個num
成員的位址.通過在pmi前面加上*你就可以使用和更改類a的num成員的值:
a a1, a2;
int n=a1.*pmi; //把a1.num賦值給n
a1.*pmi=5; // 把5賦值給a1.num
a2.*pmi=6; // 把6賦值給6a2.num
如果你定義了乙個指向類a的指標,那麼上面的操作你必須用 ->*操作符代
替:
a * pa=new a;
int n=pa->*pmi;
pa->*pmi=5;
指向函式成員的指標
它由函式成員所返回的資料型別構成,類名後跟上::符號、指標名和函式的參
數列表。舉個例子:乙個指向類a的函式成員(該函式返回int型別)的指標:
class a
; int (a::*pmf) ();
上面的定義也就是說pmf是乙個指向類a的函式成員func()的指標.實際上,這
個指標和乙個普通的指向函式的指標沒什麼不同,只是它包含了類的名字和::符
號。你可以在在任何使用*pmf的地方呼叫這個函式
func():
pmf=&a::func;
a a;
(a.*pmf)(); //呼叫a.func()
如果你先定義了乙個指向物件的指標,那麼上面的操作要用->*代替:
a *pa=&a;
(pa->*pmf)(); //呼叫pa->func()
指向函式成員的指標要考慮多型性。所以,當你通過指標呼叫乙個虛函式成員
時,這個呼叫將會被動態**。另乙個需要注意的地方,你不能取乙個類的構造函
數和析構函式的位址。
第三點:以友元類宣告巢狀的類
當你以友元類宣告乙個巢狀的類時,把友元宣告放在巢狀類宣告的後面,而不
前面。
class a
; };
friend class b;//友元類宣告
}; 如果你把友元類宣告放在宣告巢狀類的前面,編譯器將拋棄友元類後的其它聲
明。
C 語言中的一些程式設計技巧
1 如何對復合型別資料構造stl模版的比較函式。對於通用的stl演算法,比如一些排序演算法或比較演算法,都能夠自己定義比較函式。比如下面的形式 bool compare suitor a,suitor b stable sort suitors,suitors suitor count 1,comp...
C 一些技巧
一如果函式對傳入的指標引數進行修改,一定要把引數設定為指標的指標或者指標的引用 delete the first occurrence of the node which value equals item in a single linked list void delete node head,...
整理一些提高C 程式設計效能的技巧
1 使用stringbuilder代替使用string 連線符 說明 string類物件是不可變的 唯讀 一旦建立該物件,就不能修改該物件的值。物件string物件的重新賦值,本質上是重新建立了乙個string物件並將新的值賦值給該物件。如果字串存在較多次的拼接時候,最後使用stringbuilde...