一:宏定義不能換行,若要換行須用分行符號\
運算子多載:
結論1:對二元運算子,將它重載為一個友元函數比重載為一個成員函數要便於使用。以支援交換率作為一個友元函數,二元運算子不要求第一個參數一定為某類的對象。
結論2:對一元運算子,將它重載為一個成員函數最恰當。重載為友員函數也可以。
妙招:給指標變數取別名
char a = 'M';
char *p = &a;
char * &pr = p;(取別名首先也是一個指標 故char * 然後才是引用符號,所以char * &pr = p;
以及由此推演 給指標的指標取別名 char ** &pr = p;
數組名和數組名取地址區別:
設int S[5] = {1,2,3,4,5};則S是數組的首地址(意思是數組首個元素的地址) ;&S是數組的地址。雖然值相同,但意義不同,從s+1和&s+1可知道其深層意義。
{<br /> int num[5] = {1,2,3,4,5};<br /> cout<<num<<endl;<br /> cout<<num+1<<endl;<br /> cout<<&num<<endl;<br /> cout<<&num+1<<endl;<br />}<br />
建構函式的特點如下:
(1)建構函式是成員函數,函數體可寫在類體內,也可寫在類體外。
(2)建構函式是一個特殊的函數,該函數的名字與類名相同,該函數不指定類型說明,它有隱含的傳回值,該值由系統內部使用。該函數可以有一個參數,也可以有多個參數。
(3)建構函式可以重載,即可以定義多個參數個數不同的函數。
(4)程式中不能直接調用建構函式,在建立對象時系統自動調用建構函式。
解構函式的特點如下:
(1)解構函式是一個特殊的成員函數,它的名字同類名,並在前面加“~”字元,用來與建構函式加以區別。解構函式不指定資料類型,並且也沒有參數。
(2)一個類中只能定義一個解構函式,解構函式不能重載。
(3)解構函式可以被調用,(如b.~Base();)也可以由系統調用。在下面兩種情況下,解構函式會被自動調用。一是如果一個對象被定義在一個函數體內,則當這個函數結束時,該對象的解構函式被自動調用;二是當一個對象是使用new運算子被動建立的,在使用delete運算子釋放它時,delete將會自動調用解構函式。
delete語句只能釋放對象本身佔用的記憶體(對象本身佔用的記憶體用delete釋放掉了,這個問題解決)
如果這個對象在其生存期內開啟了文間、資料連線或者使用了其他資源沒有釋放,解構函式就在對象本身被銷毀前提供一個機會讓程式員可以關閉檔案、資料連線,釋放其他資源。如果不釋放這些資源就會出現隨著程式運行,系統大量記憶體就被消耗掉的現象。
虛函數:
基類中的某個成員函數被聲明為虛函數後,此虛函數就可以在一個或多個衍生類別中被重新定義.
在衍生類別中重新定義時,其函數原型,包括傳回型別,函數名,參數個數,參數類型及參數的先後順序,都必須與基類中的原型完全相同.
delete p 是一個兩步的過程:調用解構函式,然後釋放記憶體。
解構函式提供了一種和建構函式相反的機制,允許在銷毀一個對象之前(亦即回收對象所佔用的空間)讓對象釋放自己所使用的資源(這句話很精妙,也就是說,對象本身所佔記憶體是怎麼釋放的在前邊解決了,析構再解決對象使用過的資源---例如char *p = new char之類;這也解決了為什麼普通建構函式沒用new,則解構函式就不用delete的原因)
枚舉類型使用問題:
C++ 中的枚舉類型繼承於 C 語言。就像其他從 C 語言繼承過來的很多特性一樣,C++ 枚舉也有缺點,這其中最顯著的莫過於範圍問題——在枚舉類型中定義的常量,屬於定義枚舉的範圍,而不屬於這個枚舉類型。例如下面的樣本:
enum FileAccess {
Read = 0x1,
Write = 0x2,
};
FileAccess access = ::Read; // 正確
FileAccess access = FileAccess::Read; // 錯誤
C++枚舉的這個特點對於習慣物件導向和範圍概念的人來說是不可接受的。
函數指標數組:
#include<stdio.h>
int fun(int a)
{
return a+1;
}
int main()
{
int (*p[10])(int);
int i;
p[0] = fun;
i = (p[0])(10);
printf("i=%d/n", i);
return 0;
}
p[10]為一個指標數組,而該指標數組裡面的值為函數指標類型.讓p[0]指向fun()函數.然後再進行調用,就可以調用到fun()這個函數了.
類的static函數訪問非static成員:
static Base::funA(Base* p)
{
p->m_num = ....;//大概這種形式
}
#undef 是在後面取消以前定義的宏定義(取消宏定義)
TRACE宏
TRACE宏對於VC下程式調試來說是很有用的東西,有著類似printf的功能;該宏僅僅在程式的DEBUG版本中出現,當RELEASE的時候該宏就完全消失了,從而協助你調式也在RELEASE的時候減少代碼量。
使用非常簡單,格式如下:
TRACE("DDDDDDDDDDD");
TRACE("wewe%d",333);
同樣還存在TRACE0,TRACE1,TRACE2。。。分別對應0,1,2。。個參數
COM介面 :
是一個C++基類,它定義了一組純虛函數(只有純虛函數),這些函數完全控制了其衍生類別行為的一些方面
1)介面是一組規則的集合,它規定了實現本介面的類或介面必須擁有的一組規則。體現了自然界“如果你是……則必須能……”的理念。
2)介面是在一定粒度視圖上同類事物的抽象表示。注意這裡我強調了在一定粒度視圖上,因為“同類事物”這個概念是相對的,它因為粒度視圖不同而不同。
面向介面編程: 在系統分析和架構中,分清層次和依賴關係,每個層次不是直接向其上層提供服務(即不是直接執行個體化在上層中),而是通過定義一組介面,僅向上層暴露其介面功能,上層對於下層僅僅是介面依賴,而不依賴具體類。