C++ 特殊機制收集


類型轉換
reinterpret_cast 將一個類型指針轉換爲另一個類型指針
const_cast    用於去除指針變量的常屬性,將它轉換爲一個對應指針類型的普通變量,反過來也可以將一個非常量指針轉換爲一個常量指針變量
static_cast    用於轉換基本類型和具有繼承關係的類新之間轉換,不太用於指針類型的之間的轉換
dynamic_cast    只能在繼承類對象的指針之間或引用之間進行類型轉換 



命名空間
命名空間(namespace)是一種描述邏輯分組的機制,可以將按某些標準在邏輯上屬於同一個集團的聲明放在同一個命名空間中。
原來C++標識符的作用域分成三級:代碼塊({……},如複合語句和函數體)、類和全局。現在,在其中的類和全局之間,標準C++又添加了命名空間這一個作用域級別。

命名空間可以是全局的,也可以位於另一個命名空間之中,但是不能位於類和代碼塊中。所以,在命名空間中聲明的名稱(標識符),默認具有外部鏈接特性(除非它引用了常量)。
在所有命名空間之外,還存在一個全局命名空間,它對應於文件級的聲明域。因此,在命名空間機制中,原來的全局變量,現在被認爲位於全局命名空間中。
標準C++庫(不包括標準C庫)中所包含的所有內容(包括常量、變量、結構、類和函數等)都被定義在命名空間std(standard標準)中了。

  定義命名空間
有兩種形式的命名空間——有名的和無名的。

命名空間的定義格式爲:(取自C++標準文檔)

       named-namespace-definition:
       namespace identifier { namespace-body }
       unnamed-namespace-definition:
       namespace { namespace-body }
       namespace-body:
       declaration-seqopt

即:
有名的命名空間:
       namespace 命名空間名 {
              聲明序列可選
       }

無名的命名空間:
       namespace {
              聲明序列可選
       }

命名空間的成員,是在命名空間定義中的花括號內聲明瞭的名稱。可以在命名空間的定義內,定義命名空間的成員(內部定義)。也可以只在命名空間的定義內聲明成員,而在命名空間的定義之外,定義命名空間的成員(外部定義)。

命名空間成員的外部定義的格式爲:
命名空間名::成員名 ……

例如:
// out.h
namespace Outer { // 命名空間Outer的定義
       int i; // 命名空間Outer的成員i的內部定義
       namespace Inner { // 子命名空間Inner的內部定義
              void f() { i++; } // 命名空間Inner的成員f()的內部定義,其中的i爲Outer::i
              int i;
              void g() { i++; } // 命名空間Inner的成員g()的內部定義,其中的i爲Inner::i
              void h(); // 命名空間Inner的成員h()的聲明
       }

       void f(); // 命名空間Outer的成員f()的聲明
       // namespace Inner2; // 錯誤,不能聲明子命名空間
}

void Outer::f() {i--;} // 命名空間Outer的成員f()的外部定義
void Outer::Inner::h() {i--;} // 命名空間Inner的成員h()的外部定義
// namespace Outer::Inner2 {/*……*/} // 錯誤,不能在外部定義子命名空間

注意:
不能在命名空間的定義中聲明(另一個嵌套的)子命名空間,只能在命名空間的定義中定義子命名空間。
也不能直接使用“命名空間名::成員名 ……”定義方式,爲命名空間添加新成員,而必須先在命名空間的定義中添加新成員的聲明。
另外,命名空間是開放的,即可以隨時把新的成員名稱加入到已有的命名空間之中去。方法是,多次聲明和定義同一命名空間,每次添加自己的新成員和名稱。例如:
namespace A {
       int i;
       void f();
} // 現在A有成員i和f()

namespace A {
       int j;
       void g();
} // 現在A有成員i、f()、j和g()

還可以用多種方法,來組合現有的命名空間,讓它們爲我所用。例如:
namespace My_lib {
       using namespace His_string;
       using namespace Her_vector;
       using Your_list::List;
       void my_f(String &, List &);
}

使用:
using namespace My_lib;




內聯函數inline

1,內聯函數是真正的函數,只是在需要用到的時候,內聯函數像宏一樣的展開,所以取消了函數的參數壓棧,減少了調用的開銷。
2,  在C++中,在類的內部定義了函數體的函數,被默認爲是內聯函數。而不管你是否有inline關鍵字。
3, 內聯函數在C++類中,應用最廣的,應該是用來定義存取函數。我們定義的類中一般會把數據成員定義成私有的或者保護的,這樣,外界就不能直接讀寫我們類成員的數據了。對於私有或者保護成員的讀寫就必須使用成員接口函數來進行。如果我們把這些讀寫成員函數定義成內聯函數的話將會獲得比較好的效率.
4, 內聯函數也有一定的侷限性。就是函數中的執行代碼不能太多了,如果,內聯函數的函數體過大,一般的編譯器會放棄內聯方式,而採用普通的方式調用函數。

  內聯函數和宏的區別在於,宏是由預處理器對宏進行替代,而內聯函數是通過編譯器控制來實現的。而且內聯函數是真正的函數,只是在需要用到的時候,內聯函數像宏一樣的展開,所以取消了函數的參數壓棧,減少了調用的開銷。你可以象調用函數一樣來調用內聯函數,而不必擔心會產生於處理宏的一些問題。




友元

一個類的友元類可以訪問該類的私有變量
1.友元可以是一個普通函數,一個類的成員函數,或者是一個類
2.一個類的成員函數作爲另一個類的友元函數時,必須先定義這個類。
3.友元關係是單向的,不具有交換性.若類A是類B了的友元,並不代表類B是類A的友元.友元關係也不具有傳遞性.
4.友元函數的作用:1.提高了程序的運行效率.2.實現類之間的數據共享
5.缺點:破壞了數據的隱蔽性和封裝性.

友元能夠使得普通函數直接訪問類的私有數據,避免了類成員函數的頻繁調用。類的友元函數不是類的成員函數,它在類的範圍之外定義,但可以訪問該類的所有成員函數,包括私有成員。用關鍵字friend。友元函數的定義可以在類的內部,也可以在類的外部。友元函數雖然可以訪問類的私有成員,但它不是類的成員函數,也不能直接引用當前類的成員。
一個類的成員函數也可以聲明爲另一個類的友元,該函數作爲成員函數不僅可以訪問自己所在類的所有成員,還可以作爲友元函數訪問另一個類的所有成員。不僅可以把一個函數聲明成一個類的友元,一個類也可以聲明爲另一個類的友元。友元類中的所有成員函數可以訪問另一個類的私有成員。友元關係是單向的,不具有交換性,友元關係不具有傳遞性。


運算符重載

運算符重載的函數名是由關鍵字operator和要重載的運算符組成。其形式:
      返回類型 operator 運算符號 (參數列表)

發佈了48 篇原創文章 · 獲贊 20 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章