国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

# [Boolan] C++第五周 重載const,new,delete

2019-11-08 01:31:20
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

const 重載

const修飾類成員函數(shù),該成員函數(shù)里面不可能修改成員變量其中const也算函數(shù)簽名的一部分, 只用于在類的成員函數(shù)const的重載使用條件:如果一個(gè)類聲明中有const重載的函數(shù),const對(duì)象使用const修飾的成員函數(shù),非const對(duì)象使用沒(méi)有const修飾的成員函數(shù)#include <iostream>using namespace std;class Foo{public: void PRint() const{ cout << "Foo::Print const" << endl; } void Print(){ cout << "Foo::Print" << endl; }};int main(int argc, char *argv[]){ const Foo fConst; fConst.Print(); Foo f; f.Print(); return 0;}

重載new delete

new ----> Operator new 分配空間 調(diào)用相應(yīng)的構(gòu)造函數(shù)delete ---- > 調(diào)用析構(gòu)函數(shù) operator delete#include <iostream>#include <string>using namespace std;class Foo{private: int _id; long _data; string _str;public: Foo():_id(0) { cout << "default ctor. this=" << this << " id="<<_id << endl; } Foo(int i): _id(i) { cout << "ctor.this=" << this << " id=" << _id << endl; } ~Foo() { cout << "dtor.this=" <<this << " id=" << _id <<endl; } static void *operator new(size_t size); static void operator delete(void* pdead, size_t size); static void *operator new[](size_t size); static void operator delete[] (void*pdead, size_t size);};void * Foo::operator new(size_t size){ cout << " Foo::operator new " << endl; Foo *p = (Foo*)malloc(size); return p;}void Foo::operator delete(void* pdead, size_t size){ cout << " Foo::operator delete " << endl; free(pdead);}void * Foo::operator new[](size_t size){ Foo* p = (Foo*)malloc(size); return p;}void Foo::operator delete[](void*pdead, size_t size){ free(pdead);}int main(int argc, char *argv[]){ Foo *pf = new Foo; delete pf; cout << "-----------------" <<endl; //強(qiáng)制調(diào)用全局的new/delete Foo *p = ::new Foo; ::delete p; return 0;}

重載new() delete()

我們可以重載類的成員函數(shù)operator new(), 寫(xiě)出多個(gè)版本,前提是每個(gè)版本的聲明必須有獨(dú)特的參數(shù)列,其中第一個(gè)參數(shù)必須是size_t, 其余參數(shù)指定的placement arguments為初值 Foo* pf = new (300, 'c')Foo;我們也可以重載類的成員函數(shù)operator delete(),寫(xiě)出多個(gè)版本,但是他們絕不會(huì)被delete調(diào)用。只有當(dāng)new所調(diào)用的析構(gòu)函數(shù)拋出exception,才會(huì)調(diào)用這些重載版的operator delete(). 它只可能這樣被調(diào)用,主要用來(lái)歸還未能完全創(chuàng)建成功的object所占的memory.并且重載版的delete是被系統(tǒng)自動(dòng)調(diào)用的#include <iostream>#include <stdio.h>using namespace std;namespace test1{ class Foo { public: void Print() const{ cout << "Foo::Print const" << endl; } void Print(){ cout << "Foo::Print" << endl; } };};namespace test2 { class Bad{}; class Foo{ public: Foo() { cout << "Foo::Foo()" <<endl; } Foo(int) {cout << "Foo::Foo(int)" << endl; throw "拋出異常";} //(1) static void* operator new(size_t size) { return malloc(size); } static void operator delete(void* pdead, size_t size) { cout << "void operator delete(void* pdead, size_t size)" <<endl; free(pdead); } //(2) static void* operator new(size_t size, void *) { return malloc(size); } static void operator delete(void *, void *) { cout << "operator delete(void *, void *)" << endl; } //(3) static void* operator new(size_t size, long extra) { return malloc(size + extra); } static void operator delete(void *pHead, long) { cout << "operator delete(void *, long)" << endl; //free(pHead); } //(4) static void* operator new(size_t size, long extra, char init) { return malloc(size + extra); } static void operator delete(void *pHead, long, char) { cout << "operator delete(void *, long, char)" << endl; free(pHead); } };};int main(int argc, char *argv[]){ test2::Foo start; test2::Foo *p1; test2::Foo *p2; test2::Foo *p3 ; test2::Foo *p4; test2::Foo *p5 ; try { p1 = new test2::Foo; p2 = new (&start) test2::Foo; p3 = new (100)test2::Foo; p4 = new (100, 'a')test2::Foo; p5 = new (100)test2::Foo(1); } catch (const char* msg) { cout << msg<<endl; } return 0;}//////////////////////////////// 環(huán)境VC6.0Foo::Foo()Foo::Foo()Foo::Foo()Foo::Foo()Foo::Foo()Foo::Foo(int)operator delete(void *, long)拋出異常Press any key to continue引用場(chǎng)景:string中使用重載operator new()的方式,給一塊內(nèi)存添加引用計(jì)數(shù),可節(jié)省內(nèi)存空間
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 屏山县| 承德县| 右玉县| 彝良县| 肃宁县| 阳东县| 抚顺县| 德格县| 富裕县| 保靖县| 遵义市| 竹山县| 启东市| 大埔县| 松阳县| 策勒县| 辰溪县| 镇宁| 昌邑市| 罗田县| 巴楚县| 东丽区| 集贤县| 太仓市| 丰顺县| 建始县| 三都| 建水县| 锦屏县| 鱼台县| 肥西县| 永宁县| 神农架林区| 化州市| 包头市| 云浮市| 新安县| 延吉市| 海丰县| 浏阳市| 德化县|