C 特殊機制收集

2021-06-09 17:33:47 字數 3226 閱讀 5052

型別轉換

reinterpret_cast 將乙個型別指標轉換為另乙個型別指標

const_cast    用於去除指標變數的常屬性,將它轉換為乙個對應指標型別的普通變數,反過來也可以將乙個非常量指標轉換為乙個常量指標變數

static_cast    用於轉換基本型別和具有繼承關係的類新之間轉換,不太用於指標型別的之間的轉換

dynamic_cast    只能在繼承類物件的指標之間或引用之間進行型別轉換 

命名空間

命名空間(namespace)是一種描述邏輯分組的機制,可以將按某些標準在邏輯上屬於同乙個集團的宣告放在同乙個命名空間中。

原來c++識別符號的作用域分成**:**塊(,如復合語句和函式體)、類和全域性。現在,在其中的類和全域性之間,標準c++又新增了命名空間這乙個作用域級別。

命名空間可以是全域性的,也可以位於另乙個命名空間之中,但是不能位於類和**塊中。所以,在命名空間中宣告的名稱(識別符號),預設具有外部鏈結特性(除非它引用了常量)。

在所有命名空間之外,還存在乙個全域性命名空間,它對應於檔案級的宣告域。因此,在命名空間機制中,原來的全域性變數,現在被認為位於全域性命名空間中。

標準c++庫(不包括標準c庫)中所包含的所有內容(包括常量、變數、結構、類和函式等)都被定義在命名空間std(standard標準)中了。

定義命名空間

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

命名空間的定義格式為:(取自c++標準文件)

named-namespace-definition:

namespace identifier

unnamed-namespace-definition:

namespace

namespace-body:

declaration-seqopt

即:有名的命名空間:

namespace 命名空間名

無名的命名空間:

namespace

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

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

命名空間名::成員名 ……

例如:// out.h

namespace outer // 命名空間inner的成員f()的內部定義,其中的i為outer::i

int i;

void g() // 命名空間inner的成員g()的內部定義,其中的i為inner::i

void h(); // 命名空間inner的成員h()的宣告

}void f(); // 命名空間outer的成員f()的宣告

// namespace inner2; // 錯誤,不能宣告子命名空間

}void outer::f() // 命名空間outer的成員f()的外部定義

void outer::inner::h() // 命名空間inner的成員h()的外部定義

// namespace outer::inner2 // 錯誤,不能在外部定義子命名空間

注意:不能在命名空間的定義中宣告(另乙個巢狀的)子命名空間,只能在命名空間的定義中定義子命名空間。

也不能直接使用「命名空間名::成員名 ……」定義方式,為命名空間新增新成員,而必須先在命名空間的定義中新增新成員的宣告。

另外,命名空間是開放的,即可以隨時把新的成員名稱加入到已有的命名空間之中去。方法是,多次宣告和定義同一命名空間,每次新增自己的新成員和名稱。例如:

namespace a // 現在a有成員i和f()

namespace a // 現在a有成員i、f()、j和g()

還可以用多種方法,來組合現有的命名空間,讓它們為我所用。例如:

namespace my_lib

使用: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 運算符號 (引數列表)

C 雜項收集

實現雙擊關閉標籤 private void tabcontrol1 doubleclick object sender,eventargs e listview半自動載入 之所以要加個半自動,是因為它是根據選擇item的index來判斷它在items的佔比 private void listview...

動態許可權《三》華為小公尺特殊機制

對於手機廠商來,他們如何選擇,也不同。比如早期的vivo oppo,乾脆不上6.0以上的rom,或者上了把動態許可權這塊閹割掉。這樣使用者用起來和以前沒區別,加上他們的使用者群體都是小白使用者,完全不關心這些。而小公尺的就坑爹了,不僅有系統的許可權設定,還有自己的設定頁面的許可權設定,這就導致了有時...

C 特殊成員

必須採用初始化引數列表的方式進行初始化 const資料成員不能被改變 寫法 const放在引數列表的後面 常成員函式可以形成過載 常成員函式不能修改基本資料成員 示例 include include using namespace std const資料成員 1.必須採用初始化引數列表的方式進行初始...