C 雜項知識點

2021-10-05 13:45:13 字數 2268 閱讀 3373

預設引數:靜態繫結

虛函式的替代設計:non-virtual-inte***ce(nvi) --effective c++c++前置宣告

如果b只是保留a的指標或引用,並不用a的成員函式或變數,可以無需包含a的標頭檔案,減少編譯依賴

sizeof

#pragma pack(8)

struct s1;//sizeof(s1) = 8

struct s2;//sizeof(s2) = 24

#pragma pack()

如果有pragma pack(n),則對齊的規則為min(n,sizeof(type))

#pragma pack(4)

struct s1;//sizeof(s1) = 8

struct s2;//sizeof(s2) = 20

#pragma pack()

建構函式、析構函式都不採用動態聯編,呼叫虛函式執行的是建構函式或者析構函式本身型別的方法。

拷貝建構函式:

形式如a::a([const] a& obj){}

或者可以帶預設值的引數

呼叫場景:物件以值的方式作為引數傳入方法,物件以值傳遞方式從函式返回(跟編譯器相關,-fno-elide-constructors強制呼叫),物件需要另外乙個物件初始化。

賦值建構函式:

a& a::operator=(const a& obj){}

需要校驗自賦值問題,可以判斷*this;也可以保留原有obj的指標,new完之後再釋放;也可以採用swap的方式。

移動建構函式:

形式如a::a(a&& obj){}

場景:用a初始化b,且用完之後a就不再使用,需要在函式體中將a中的空間置為nullptr。

隱藏:

如果派生類的函式名與基類函式名相同,但是引數不同,不管有無virtual,基類的函式被隱藏。

如果派生類函式與基類函式同名,引數相同,但是沒有virtual,基類函式被隱藏。

可以在子類中使用using 宣告式,顯示父類中被遮蔽的函式

虛函式表:

對存在虛函式的物件,編譯器會生成乙個虛表,存放每個虛函式的位址,採用虛表指標vptr進行索引。建構函式中進行虛表的建立和虛表指標的初始化,所以在建構函式中不能呼叫虛函式,因為結果是不可控的。

含虛函式的編譯:採用晚繫結方式,編譯時不確定具體呼叫的函式,呼叫時根據物件指標進行查詢並呼叫。

class、struct

class預設訪問許可權是private,struct預設是public,friend可以訪問朋友類裡所有private的成員和方法

static關鍵字:

1、隱藏宣告在某個檔案中的變數(非類變數)。static宣告的變數跨檔案找不到。

2、因為static變數儲存在靜態儲存區,所以會程式執行時初始化,保持變數內容持久。

3、static宣告的全域性變數放在原始檔而不是標頭檔案,防止static變數的汙染。(如果定義在標頭檔案中,在兩個編譯單元中的static變數的static成員並不指向同一塊記憶體位址)

4、靜態成員函式不能直接訪問類的私有成員變數,但是可以通過傳入乙個類成員的指標來解決。

volatile關鍵字:

型別修飾符,一種語言級別的記憶體屏障,編譯器對該變數訪問的**不進行優化,提供對特殊位址的穩定訪問。系統總是從記憶體中讀取資料。

多用於:多工環境下的共享標誌;但是並不能保證多執行緒的併發性。

extern關鍵字:

該變數、函式在別處定義,在此處引用;可以不用包含標頭檔案

extern 「c」:可以單一語句、復合語句、標頭檔案。按照c語言的規則翻譯函式名,

變數:extern--宣告,其他--定義。

.**件中宣告的全域性變數,只能在同乙個.cpp檔案中定義

const關鍵字:

只能用於本編譯模組,但是可以與extern連用,應用於其他編譯模組中。

bss、data、堆疊:

初始化為0或未初始化的全域性或靜態值都存在bss段中。

雜項知識點

1 zn xn 當對映矩陣為方陣且為單位陣,隱馬爾可夫模型退化成標準馬爾可夫模型。2 強化學習 馬爾可夫決策符合馬爾可夫假設。3 漢森矩陣,二階倒數在多元函式上的推廣 把多元函式進行泰勒展開 常用於影象風格遷移 牛頓法。牛頓法 線性方程組求解搜尋方向需要漢森矩陣的逆 距離最優解比較近時搜尋快 擬牛頓...

常見C 知識點

1 非c 內建型別 a 和 b,在哪幾種情況下b能隱式轉化為a?a.class b public a b公有繼承自a,可以是間接繼承的 b.class b b實現了隱式轉化為a的轉化 c.class a a實現了non explicit的引數為b 可以有其他帶預設值的引數 建構函式 d.a oper...

C 知識點複習

static static變數只能初始化一次 include include using namespace std void fun int i int main 輸出為 0 00因為static變數只初始化一次,static int value i這句話只執行一次,也就是fun 0 的時候執行。...