C 基礎知識

2022-09-01 21:00:41 字數 2958 閱讀 6606

1.bind()

函式物件:可以以函式方式與()結合使用的任意物件,包括 function 仿函式、函式名、函式指標、含有()操作符的類物件。

function是一組函式物件包裝類的模版,(又叫仿函式)實現乙個泛型的**機制,function< int( int, int)>形式,可呼叫的物件普通函式、函式指標、lanmbda表示式、函式物件和類的成員函式等。

int add(int i, int j)

auto mod = (int a, int b)

struct

divide

};function

func1 =add;

function

func2 =mod;

function

func3 =divide;

func1(

1, 2

);int a = func2(1, 2

);func3(

1, 2);

//

bind

template

/*unspecified

*/ bind (fn&& fn, args&&... args);

bind返回乙個和fn功能相同,但引數是args(已經填好了,呼叫時不用傳參了)和佔位符的函式物件,如果fn是成員函式,則返回值第乙個引數this指標。

struct

integer

void incr_by(int j)

};integer x(0);

integer* y = &x;

using

namespace

std::placeholders;

auto f0 = bind(&integer::incr_by, _1, _2);

f0(x,

2); //

x.incr_by(2); x.i = 2;

f0(y,2);//

y->incr_by(2); x.i = 4;

auto f1 = bind(&integer::incr_by, x, _1);

f1(2); //

這裡x是值傳遞,呼叫的是乙個臨時物件的incr_by函式,x的i不改變。

auto f2 = bind(&integer::incr_by, ref

(x), _1);

f2(2);//

引用,x改變了,x.i = 6;

auto f3 = bind(&integer::incr_by, &x, _1);

f2(2);//

指標,x改變了,x.i = 8;

2.vitual

c++在布局以及訪問時間上主要的額外負擔是vitual引起的,因此在真的需要執行時多型,才用虛函式(注意:必須是基類型別的指標或引用才觸發動態繫結)。

vitual函式:用於支援「執行期繫結」,以實現多型。  vitual繼承: 用於實現類似菱形繼承中的基類只有乙個單一被共享的實體(a->b->d;a->c->d;vitual繼承,則d中只有乙個a的實體)。

有虛函式的類在建立物件時,在建構函式中先生成乙個虛函式表,表裡依次存放所有虛函式的位址,生成的物件中有乙個虛函式指標指向虛函式表。

而生成派生類物件時,會先呼叫基類的建構函式,生成乙個基類的虛函式表,然後呼叫派生類的建構函式,會覆蓋虛函式表中同名的函式,從而實現多型(這就是c++裡的動態連編:在程式執行時選擇呼叫哪個函式)。

而函式隱藏的目的則是:使父類的改動不會影響子類過載的呼叫

3.const用法

i.代替巨集定義,定義常量

ii.const * 常量指標。 與 * const 指標常量。

iii.修飾函式返回值,常用在返回值為使用者自定義型別。

iv.修飾函式引數(一般為指標、引用),使得 非const 和 const型別(一般為值傳遞的臨時物件)都能作為實參呼叫。

v.在類中,修飾成員函式,反正()後面,表明此函式不能改變物件的成員變數,const物件只能呼叫const成員函式。

4.記憶體管理

c++動態記憶體可能出現的問題:

i.記憶體洩露,new/delete 和 malloc/free 沒有配套使用,或者在建構函式中new了之後丟擲異常,就不會執行析構函式中的delete。

解決方法:用智慧型指標代替new/delete管理物件,注意shared_ptr和 unique_ptr的區別(unique_ptr無法複製構造和賦值操作,但可以移動構造和移動賦值(如作為函式返回值)), 在遇上環形引用(類a中有類b的智慧型指標引用物件,類b中有類a的智慧型指標引用物件,兩個都有乙個對方的引用計數,無法析構)時使用乙個weak_ptr。 

ii.野指標,指標未初始化且未指向null 或 指向乙個已刪除的物件(如函式體內區域性物件,或delete後未置null),則指標會隨機指向一塊記憶體,很可能是本程式中已使用的記憶體或資料,如果此時通過此指針對該記憶體寫操作,可能造成程式崩潰或資料汙染,(且野指標難以發現,危害大)。

解決方法:初始化時置null,釋放時置null。

iii.記憶體碎片,頻繁的使用new/malloc,由於所申請的記憶體大小不定而造成記憶體碎片。

解決方法:記憶體池,在使用記憶體之前,先申請分配一定數量大小相同的記憶體塊組成的記憶體池作備用,當有新的記憶體需求時,就從記憶體池分出一部分記憶體塊,若記憶體塊不夠再申請新的記憶體。

5.new/delete 和 malloc/free 比較

i.new/delete 是c++運算子(運算子是編譯器控制的,因此可以過載),malloc/free 是標準c庫函式,不受編譯器控制。

ii.malloc只負責申請一塊一定長度的記憶體,而new不僅分配了記憶體,還進行了sizeof,型別轉換,型別安全檢查,還呼叫了建構函式,delete呼叫了析構函式。

iii.malloc/free需要庫檔案支援,而new/delete不需要。

C 基礎知識

抽象類 abstract class 一種不可以被例項化的類。抽象類中一般含有抽象方法,當然也可有具體實現。繼承類只有實現過所有抽象類的抽象方法後才能被例項化。介面 inte ce 只含有共有抽象方法 public abstract method 的類。這些方法必須在子類中被實現。反射 程式集包含模...

c 基礎知識

或運算的意義是什麼 0 0 0 0 1 1 1 0 1 1 1 1 無進製與運算的意義是什麼 在vc中,視窗的每個屬性對應乙個只有一位為1的16位的二進位制數,當增加某屬性做或運算 即可,取消某個屬性只需與 上這個屬性的取反。cs.style ws maximizebox 和cs.style cs....

C 基礎知識

1 malloc和new區別與聯絡 a malloc malloc為函式,需要標頭檔案,申請的無型別,需要強制轉換 free釋放。示例 char p char malloc 10 sizeof char free p b new new是運算子,不需要標頭檔案,申請的是有型別的,自動呼叫建構函式 d...