// 乙個例子
class a
void
fun(
int,
int)};
// pf是乙個指標
// 指向乙個型別a的成員函式
// 該成員函式形參為(int,int)
// 返回值為void
void
(a::
*pf)
(int
,int);
pf =
&a::fun;
a a;
a *pa =
&a;(a.
*pf)(10
,10);
(pa->
*pf)(10
,10);
function<
void
(const a&
,int
,int
)> fcn =
&a::fun;
vector vec =
;find_if
(vec.
begin()
, vec.
end(
), fcn)
;function<
void
(a*,
int,
int)
> fcn =
&a::fun;
vector> vec =
;find_if
(vec.
begin()
, vec.
end(
), fcn)
;
class a~a
()..
.}
c++中一切皆型別[基礎資料型別也可視為型別處理]
- 分配
// 實際執行兩步
// - 呼叫void* operator new(size_t)可定製操作符進行物件a記憶體空間分配
// - 呼叫new (p) a(實參列表)不可定製的定位new表示式完成位址a處物件a的構造
a* p = new a
(實參列表)
;// 實際執行兩步
// - 呼叫void* operator new(size_t)可定製操作符進行10個物件a連續記憶體空間分配
// - 呼叫new (pa) a[10]不可定製的定位new表示式完成位址p處開始連續10個物件a的預設構造
a* pa = new a[10]
;
- 釋放
// 實際執行兩步
// - 呼叫p->~a()完成p指向物件a的析構
// - 呼叫void* operator delete(void*)可定製操作符,完成p指向位置乙個a物件大小記憶體空間的釋放
delete p;
// - 對陣列每個元素pi呼叫pi->~a()完成pi指向物件a的析構
// - 呼叫void* operator delete(void*)可定製操作符,完成p指向位置10個a物件大小記憶體空間的釋放
delete [
] pa;
- 分配
a* p = operator new
(sizeof
(a))
;new (p)
a(實參列表)
;a* pa = operator new
(sizeof
(a)*10)
;for
(int i =
0; i <
10; i++
)
- 釋放
p->~a
();operator delete
(p);
for(
int i =
0; i <
10; i++
)operator delete
(pa)
;
注意:
- operator new()會呼叫malloc進行記憶體分配
malloc分配後返回的指標指向首個可用有效位元組位置.在此位置前,還有一部分已分配的記憶體,
用於記錄此返回指標可用的記憶體空間大小等管理資訊.
即malloc實際分配的內容為我們要求的資料區+管理區,
資料區還會有對齊要求,可能分配的資料區比要求的大.
因為上述原因,malloc返回的乙個指標,需要相應的呼叫一次free完成指向的整塊空間的分配
對malloc分配的大塊空間,多次在此空間不同位置,使用多次free是不允許的.
operator new/operator delete分別是malloc/free的簡單封裝
operator new/operator delete與operator new/operator delete除了名字差異,沒有什麼本質差別.
都是malloc/free的簡單封裝
std:
:allocator alloc;
- 分配
t* p = alloc.
allocate(1
);alloc.
construct
(_p,t(
));t *pa = alloc.
allocate(10
);for(
int i =
0; i <
10; i++
)- 釋放
alloc.
destroy
(p);
alloc.
deallocate
(p,1);
for(
int i =
0; i <
10; i++
)alloc.
deallocate
(pa,10)
;
注意:
- alloc.deallocate(void*, size_t)的引數2一般是被忽略的.
因為如前所述,
乙個alloc.allocate(size_t)內部借助malloc返回一塊空間
而乙個malloc返回的一塊空間,也只需也只能通過返回指標呼叫一次free來釋放.
故一般實現alloc.deallocate的引數2是被忽略的.
c++一切皆物件
不可用malloc/free來分配和釋放物件
malloc/free完成的是記憶體空間的分配和釋放,不會對分配的物件執行構造[在指定位址調建構函式]和析構[在指定位址調析構函式].
malloc/free是c中分配/釋放記憶體的方式,不適合c++中物件的分配/釋放
C 物件導向 類成員函式this指標
每個類成員函式都只涉及乙個物件,即呼叫它的物件。但有時候方法可能涉及到兩個物件,在這種情況下需要使用c 的 this 指標 假設將方法命名為topval 則函式呼叫stock1.topval 將訪問stock1的物件資料 stock2.topval 將訪問stock2的物件資料 如果希望該方法的兩個...
3 1 成員函式,物件拷貝,私有成員
主main函式 include include time.h 成員函式,物件拷貝,私有成員 1 綜述 2 類基礎 3 成員函式 4 物件的拷貝 5 私有成員 using namespace std struct student class time void inittime int tmphour...
15 成員函式的分離
1 標頭檔案的宣告 pragma once 表示的是只包含一次 ifndef a h意思是 if not define a.h 如果不存在a.h 接著的語句應該 define a h 就引入a.h 最後一句應該寫 endif 否則不需要引入 ifndef teacher2 h define teac...