读书笔记:C++ primer 5th edition--chapter19.特殊工具与技术
以下是c++未被广泛应用的特征。 part1.控制内存分配 1.可以重载new与delete。一共有八个版本,可以重载任意一个,但是要求自定义版本必须位于全局作用域或者类作用域。 2.demo void *operator new(size_t size){ if (void * mem = malloc(size) return mem; else throw bad_alloc(); } void operator delete( void *mem) noexcept { free(mem); }
part2.运行时类型识别RTTI 1.适用于我们想让基础类对象的指针或引用执行某个派生类操作并且该操作不是虚函数。因为某些场景无法定义虚函数。 2.在条件部分执行动态转换可以确保类型转换和结果检查在同一条表达式完成。 if( Derived *dp = dynamic_cast < Derived* >(bp) ) {}// 3.typeid运算符 1)作用于对象,而不是指针 2)对象有虚函数,则typeid的结果知道运行才确定。 4.RTTI用途:为具有继承关系的类实现相等运算符时有用。
part3.枚举类型 1.分类: 1)限定作用域的枚举类型,enum class open_mode {input, output, append}; 2)不限定作用域的枚举类型, enum color {} or enum {} //未命名,不限定 2.如果不指定枚举值,默认为前者的值加1.成员是const,初始化枚举成员必须提供常量表达式。 3.指定enum大小 enum intValue : unsigned long long {}..
part4.类成员指针 1.类的成员指针是可以指向类的非静态成员的指针。 2.初始化的时候不指定对象,只指向成员。 const string Screen::*pdata;//声明pdata为一个指向Screen类的const string成员的指针。 可以读取任意对象,但是,无法写入。 auto pdata = &Screen::contents;//contents是Screen的私有成员,pdata必须位于类内部或者友元内。 3.成员函数指针 //为了选择重载的版本 char (Screen::*pmf2) (Screen::pos, Screen::pos ) const; pmf2 = &Screen::get;//限定get的版本,通过限定可以接受的形参以及返回值 char c2 = (myScreen.*pmf2) (0, 0);//调用优先级高,因此要加括号
part5.剩余 1.嵌套类,union,局部类 2.volatile与const可以兼容 3.合成的拷贝对volatile对象无效 4.extern void (*pf1) (int); //指向c++函数 extern “C” void (*pf2) (int); //指向c函数