1. 程式人生 > >【c++】查缺補漏

【c++】查缺補漏

c++中new操作的返回值:

new返回一個指標,如int *p=new int;返回一個指向int的指標,int *p=new int[10],返回一個指向含有10個int元素的陣列的首地址。

new失敗的操作:

在早期c++版本中,如果系統不能夠滿足使用者new的記憶體需求,則繼承c語言的處理方法,返回一個指向NULL的指標;後來c++的版本中,則是跑出bad_alloc異常,所以針對兩種情況有三種處理方法:

① 老版本:

int *p=new int[100000000]
if(p==NULL){
//失敗處理
}

②新版本:

int *p;
try {
   p=new int[100000000
]; }catch(const std::bad_alloc& e){ //異常處理 }

③相容版本:

int *p=new (std::nothrow)int[100000000];
if(p==NULL){
//失敗處理
}

const在各個位置的作用

①const DATATYPE a=?;
DATATYPE型別的常量,const修飾資料型別DATATYPE,表示該修飾符的值不可修改。

②const DATATYPE *p;
一個常量指標,const修飾資料型別DATATYPE,表示該指標p指向的DATATYPE型別資料不可修改。

③DATATYPE const *p;


與②相同。

④DATATYPE* const p=a pointer;
一個指標常量,const修飾指標*,表示該指標是一個常量,它的值不能改變,也就是說它只能指向同一個地方,不能指向其他地方。

⑤const DATATYPE *const p=a pointer;
②和④的組合,表示一個常量指標常量,這種表示方法p的值不能修改,即只能指向一個位置,p指向的東西也不能修改。

⑥const int *functionName(….)
const修飾函式返回值的資料型別int,表示函式返回的指標指向的內容不能改變。

⑦const int *functionName(…)const;


函式名後有const的這種形式比較特殊,函式常量,只能出現在類中
第一個const修飾返回值得int,表示返回的指標指向的內容不能改變;第二個const修飾函式名,表示const成員函式,這種修飾限制了該函式的訪問許可權,它只有讀成員變數的許可權,沒有寫許可權。為什麼要這樣限制能,因為類可以例項化為一個常物件,常物件的值是不允許修改的(即常量),而常物件只能呼叫類的常量函式,所以常量函式不能修改類的內容,即不能有寫許可權。從另一個角度應該更好理解,類的get(獲取成員)的方法,應該有const和非const兩個版本,const版本是為const物件準備的,因為const物件只能訪問const成員函式。

友元函式

類具有封裝性,外部函式不能訪問類的私有成員,如果需要訪問類的私有成員,需要將函式在類內進行申明,格式較普通函式申明只是在前面加了friend關鍵字,友元函式不是類的成員函式,它只是一個普通的函式,但它可以訪問類的私有變數,訪問的類需要以引用的形式傳遞引數。

class foo{
    public:
    friend void bar(foo &a,foo &b,...);//類內申明bar為友元函式
    //...other function
    private:
    //private element
};

void bar(foo &a,foo &b,...){
    //函式定義,可以操作a,b的私有成員
}