- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C模板参数
C++模板中的函数对象在C++模板类map中一个参数为Compare类型,该类型为一个比较函数,其完整定义如下:templateclass Key,class T,class Compare = std::lessKey,class Allocator = std::allocatorstd::pairconst Key, T class map;函数作为类进行传递,该类采用了重载操作符()来实现函数指针到类的转变。在实际中也可以仿照此风格写自己的类。template typename Key, typename Value, class Hash class A {Hash hash_fn;public:A():hash_fn(Hash()) {}size_thashCode(Key key) { return hash_fn(key);}};第三个参数Hash为函数对象,该对象通过重载操作符()来实现,其一个字符串类型的Key定义如下:structstr_hash {size_t operator()(conststd::string str) const{return 0;}};当调用hash_fn(key)函数时,该重载函数被调用,这样就实现了转换。由于C++标准库中包含有大量此类型风格的类,我们就可以通过默认参数来调用标准类,这样上面的模板类A就可以定义如下:template typename Key, typename Value, class Hash = std::hashKey测试程序如下:int main(intargc, char *argv[]) {Astd::string ,int, str_hash a;std::cout hashCode: a.hashCode(abc) std::endl;Astd::string,int,std::hashstd::string h;std::cout h.hashCode(abc) std::endl;Astd::string,int h2;std::cout h.hashCode(abc) std::endl;return 0;}测试结果如下:functiontemhashCode:033509774613350977461C++ 中的对象布局C++中的涉及到虚表时,类对象的布局分为:虚表与数据成员,子类包含派生类布局,假设下面一个程序:#include iostreamusing namespace std;class B {private:int a;public:B() {a = 11;}virtual void fun() {cout B::fun endl;}};class A:public B {public:A() {cout class A constructor endl;m = 3;n = 2;}~A() {cout ~A() endl;}virtual void fun() {cout A::fun endl;}private:intm,n;};int main(intargc, char *argv[]){A a;int *p;int **pvtr = (int **)a;typedef void (*pf_t)();pf_t pf;p = static_castint *((int *)a);pf = (pf_t)(pvtr[0][0]);pf();//cout *pf: *pf ,pf: pf endl;//(*(*pf+sizeof(void*) * 2))();cout p: *p endl;p ++ ;cout p: *p endl;p++;cout p: *p endl;p++;cout p: *p endl;p++;cout p: *p endl;return 0;}通过VS 2010显示对象布局图(cl -d1reportAllClassLayout),其中meta为对应对象的类型信息:类B:class Bsize(8):+--- 0| {vfptr} 4| a+---B::$vftable@:| B_meta| 0 0| B::funB::fun this adjustor: 0类A:class Asize(16):+---| +--- (base class B) 0| | {vfptr} 4| | a| +--- 8| m12| n+---A::$vftable@:| A_meta| 0 0| A::funA::fun this adjustor: 0C++中的初始化C++中的RAII机制指明”对象创建时通过构造函数进行初始化,析构时通
文档评论(0)