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指標。
structinteger
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...