1.面向對象技術的基本概念
對象集绰,類,繼承
2.C++中的空類默認產生哪些成員函數
編譯器默認產生默認構造函數知押,析構函數,拷貝構造函數鹃骂,賦值函數台盯。
3.構造函數
strct Test{
Test(int) {}
Test() {}
void fun(){}
};
int main(){
Test a(1);
a.fun();
Test b();//這里沒有參數傳遞的構造函數直接用Test b;就可以了
//加了括號反而沒有真正實例化類對象
b.fun(); //編譯器會在這里檢查出錯誤,b不是類對象
return 0;
}
4.成員變量
- 靜態(tài)成員變量時在一個類的所有實例間共享數據的畏线,通常在定義時要初始化
- 靜態(tài)成員變量若為私有静盅,可以通過共有靜態(tài)成員函數訪問
- 初始化列表中的變量初始化順序是按照成員變量的聲明順序來執(zhí)行的
- 常量必須在構造函數的初始化列表里初始化,或者將其設置成static
class A
{
const int Size = 0; //不對寝殴!
A(){const int Size = 9;//對蒿叠!
static const int Size =9;//對!
}
5.構造函數和析構函數
- 析構函數virtual原因:當pBase指針撤銷時蚣常,調用的是CBase的析構函數市咽,而不是CChild的析構函數,這時內存泄露史隆。因為CChild構造時會先調用CBase的構造函數魂务,然后CChild的構造函數,只有基類的析構函數聲明為virtual時泌射,析構時才會以同樣的順序依次調用基類的析構函數粘姜。
CBase *pBase;
CChild c;
pBase = &c;
- 構造函數不能是虛的
- 虛函數的開銷:存在虛函數的對象需要維護一個向量表,如果僅是一個很小的類熔酷,且不想派生其他類孤紧,那么根本沒必要使用虛函數。
- 析構函數的發(fā)生:函數返回時
6.String的函數
class String{
public:
String(const char *str = NULL);
String(const String &other);
~String(void);
String & operate = (const String &other);
private:
char *m_data;
}
//構造函數
String::String(const char* str)
{
if( NULL == str)
{
m_data = new char[1];
*m_data = '\0';
}
else
{
int length = strlen(str);
m_data = new char[length+1];
strcpy(m_data,str);
}
}
//析構函數
String::~String(void)
{
delete [] m_data;
}
//拷貝構造函數
String::String(const String &other)
{
int length = strlen(other.m_data);
m_data = new char[length+1];
strcpy(m_data,other.m_data);
}
//賦值函數
String& String::operater=(const String &other)
{
if(this = &other)
return *this;
delete [] m_data;
int length = strlen(other.m_data);
m_data = new char[length+1];
strcpy(m_data,other.m_data);
return *this;
}
7.多態(tài)的概念
- 一個接口拒秘,多種方法号显。封裝和繼承是為了代碼重用臭猜,而多態(tài)是為了接口重用。在調用函數時押蚤,傳遞給函數的父對象的值可以是子對象蔑歌,在運行時根據傳遞的對象來確定具體的操作。
重載和覆蓋的區(qū)別:重載是靜態(tài)的揽碘,重載是編譯器根據函數不同參數表次屠,對同名函數進行修飾,在編譯期間已經綁定了雳刺。而覆蓋是在子類重新定義了父類的虛函數后劫灶,父類根據賦給他的不同子類,動態(tài)的調用屬于子類的該函數掖桦,實現動態(tài)綁定本昏。
覆蓋需要一致的參數表和返回值,而重載參數表可以不同枪汪。