一、指針(*)與引用(&)的異同:
指針與引用都是表示一個變量的地址,但是它們的使用方式有很大的區別:
1、 引用在聲明的時候必須使用一個變量進行初始化,而且以後引用指向的地址永遠不能夠改變,引用所有的操作都作用於初始化變量,
2、 但是指針沒有這些限制。
3、 使用的方式有很大的區別:
int a=10;
int& cite=a;
int* pointer=&a;
cite++;
(*pointer)++;
Cite.method();
Pointer->method();
二、指針數組:
cout << pointer+1 << endl; // 23456789
cout << pointer << endl; //123456789
cout << *pointer << endl; //1
cout << *(pointer+1) << endl; //2
cout << *pointer+1 << endl ; // error;
三、const
1、 const dataType data=dataValue; //以後data的值不允許變化。
但是實際上可以通過非法的手段修改const的值的,例如:
void TestConst()
{
int const num=10;
int& cite=(int&)num;
int* pointer=(int*)#
cout << "no change--------:"<<endl
<<"num=" << num << endl //10
<<"cite=" << cite << endl //10
<<"*pointer="<<*pointer << endl; //10
cite++;
cout << "cite++--------:"<<endl
<<"num=" << num << endl //10
<<"cite=" << cite << endl //11
<<"*pointer="<<*pointer << endl; //11
(*pointer)++;
cout << "(*pointer)++--------:"<<endl
<<"num=" << num << endl //10
<<"cite=" << cite << endl //12
<<"*pointer="<<*pointer << endl; //12
}
所以類中函數不應該返回指向自己私有變量的引用或者指針,儘管這些變量使用const限制。
2、 指針與const的組合:
a、datatype * const pointer; :對指針作限制,指針的內容(也即變量的地址)不能夠改變,但是指針對應變量的內容可以改變
b、Const datatype * pointer; :對指針對應變量的內容進行限制,也即指針不能夠改變變量的值,但是指針可以改變它指向的位置。
c、Const datatype * const pointer; :指針保存的變量的位置以及對應變量的內容都作限制,都不允許改變。
可以這樣記憶:
線型考慮,const僅僅對自己後面的名詞起作用:
如a情況的話,const 對pointer 起限制作用,也就是pointer的內容不允許改變,而pointer的內容爲變量的內存地址,也就是不允許指針指向的變量進行改變。
如b情況的話,const 對* pointer起限制作用,而*pointer表示指針指向變量的內容,也就是指針指向變量的內容不允許改變,但是pointer的內容卻可以改變,也就是pointer可以改變指向的變量。
c情況則對上面兩種都作限制。
3、 儘量多使用const而不是用#define parameter=value這種方式,因爲後者依賴於c 預編譯程序,不利於錯誤的查找。
四、Inline函數:
inline函數也是依賴於c預編譯程序的,任何使用inline函數的地方,都會使用inline的代碼直接替換
優點有:可以減少函數間的調用,而且預編譯程序對不同使用情況會有專門的優化措施,所以運行速度快。
但是缺點也對應的存在:a、增加編譯後文件的大小,增加在運行時內存需求量。
B、如果inline函數過於複雜,預編譯程序就把把它作爲普通的函數進行是用,而且具體的處理方式依賴於c編譯器,並不是所有的編譯器都一樣的對待,所以有出現錯誤的可能。
五、友元成員(外部類、外部類方法、外部函數):
1、 所謂的友元成員是指在一個類中進行聲明的,具有特權訪問該類的private以及protected parameter的成員。
2、 友元成員並不是聲明類的一部分。
3、 子類不具有友元成員聲明的繼承性。
六、*.h、*.c、*.cpp文件各自作用:
1、 *.h文件一般用來作爲公共引用(#include)、函數、類以及公共變量或者類型的聲明的地方,而*.c、*.cpp一般用來作爲函數以及類實現的地方。
2、 如果想使用非本“域”的類、函數的話,一般會在文件頭使用#include “name.h”聲明,將這些類引入本“域”,是這些類或者函數在本“域”可感知。
3、 對於函數或者公共變量也可以使用“extern”進行生命,使它們在本“域”可以被感知。
七、有關類繼承的一些知識小結:
1、 類名::成員名稱,在這裏“::“起作一個作用域限制作用
2、 在子類中明確的調用父類的每個方法: ClassBaseName::Method(…..)。
3、 如果一個子類繼承了多個父類,而這些父類有相同名稱的函數,而子類卻沒有重載它們的話,要使用子類調用這些函數,則必須明確的指明父類的名稱,即:son.ParentClassName::Method();
4、 虛函數(用virtual聲明的函數):即可以被子類重載的函數。
5、 純虛函數是指在父類中使用virtual標示而沒有實現的函數,子類必須實現這個函數才能夠使用,純虛函數聲明方式: virtual returnType MethodName(…..)=0;
6、 Abstract類,即其中至少含有一個純虛函數聲明的類,這種類不能夠直接使用,只能夠通過子類實現這些純虛函數。
7、 C++中virtual derivation 與Nonvirtual Derivation的區別:
8、 在c++中的Novirtual Derivation 等同於c#中new關鍵字重載父類函數,而virtual derivation等同於c#中的override關鍵字重載父類函數。
9、 public、protected、private繼承。
public繼承爲”類型繼承“,基類的所有公共成員都成爲基類的public成員,它可以改寫基類的實現方式,繼承基類的公共接口,反映了"is-a"的關係。
private繼承爲”實現繼承“,基類的所有公共成員都成爲派生類的私有成員,派生類不直接支持基類的公共接口,但它可以實現自己的公共接口,並且重用基類的功能實現。
protected繼承是指基類的所有公共成員都成爲派生類的protected成員,它可以使用基類的功能實現,但是對外不能夠繼承基類的公共接口,並且可以被”後來從該類繼承的派生類“訪問。
private繼承與組合的選擇
10、 構造函數與析構函數的順序。
八、RIIT(運行時刻類型辨別):
1、 dynamic_cast:安全的轉換函數,一般在轉換前執行兩部操作:操作之前進行檢驗所執行的轉換是否有效,只有在有效的情況下才執行轉換。
一般用作基類指針向派生類指針轉換,如果轉換無效則返回0。
也可以用作基類引用向派生類 引用轉換,但是如果轉換失敗會引發異常(std::bad_cast)。
2、 typeid(表達式或者ID):動態的獲取一個表達式或者ID的類型信息,返回type_info類變量。
3、 type_info類:來表示類型信息的類,具有name(),raw_name(),==,!=等成員,常常和typeid用來判別對象的類型信息,使用方法如下所示:
cout << typeid(student*).name() << endl; //student*
cout << typeid(student).name() << endl; //student
cout << typeid(student&).name() << endl ; //student
if(typeid(oneStudent)==typeid(student)) .....;
九、異常處理:
try
{
....
throw exception(...);
}
catch(exception ex)
{
...
}
1、 處理所有的異常:
catch(...)
{
.....
throw; //重新拋出異常。
}
2、 異常與虛擬函數:
一般常用catch(Exception& ex)來避免這種情況。
情況類似於下面的情況:
ChildClass child;
BaseClass base=child;
base.VirtualMethod();
//這個時候還是使用的是BaseClass的實現,而不是ChildClass的實現。
-------------------------------
ChildClass child;
BaseClass& base=child;
base.VirtualMehod();
//這個時候使用實際上是ChildClass的實現,而不是BaseClass的實現。
也說明了要調用派生類的虛擬函數則對應基類必須生命爲指針或者引用。
3、 在函數或者函數指針後面添加 throw(exceptionType)表明該函數或者函數指針可能會拋出的一場類型。
十、重載操作符:
1、 聲明方式:
bool operator ==(const MyClass& myClassObject);
bool operator ==(const MyClass& object1,const MyClass& object2);
2、 重載操作符分爲內置(類成員)與外置(非類成員)兩種,如果非類成員重載操作符好使用類的保護或者私有成員的話則需要聲明爲類的友成員。
3、 只有C++中預定義的操作符號才能夠重載,類設計者不能夠聲明一個非C++預定義的操作符進行重載。
4、 預定義操作符的優先級不能夠被改變,操作符的參數個數不能夠被改變。
5、 內置操作符如果有多個參數,那麼當前類對象被默認(必須被默認)爲第一個參數,但是不需要顯示的放置在操作符的參數列表中,而外置操作符則必須將所有的參數明確的列示出來。
6、 付值(=)、下標([])、調用(())和成員訪問箭頭(->)必須被定義類成員操作符。
結構體、宏、函數指針、模版、STL、數據結構、Socket、ACE、ICE。