《C++必知必会》读书笔记
1.
explicit //禁止隐式转换
mutable
virtual inheritance
2.
内部类?
3.
数组在传入时,实质上只传入指向其首元素的指针
void average(int (&ary)[12]); //只能接受大小为12的整型数组
temlpate <int n> void average (int (&ary)[n]);
void average_n(int ary[], int size);
temlpate <int n> inline void average (int (&ary)[n])
{average_n(ary, n);}
4.
static_cast用于将一个继承层次结构中的基类的指针或引用,向下转型为一个派生类的指针或引用
Shape * sp = new Circle;
Circle * cp = static_cast<Circle *> (sp);
dynamic_cast通常用于执行从指向基类的指针安全地向下转型为指向派生类的指针,仅用于对多态类型进
5.
行向下转型
6.
类X的非常量成员函数中,this指针的类型为 X *const。 (指向一个非常量X的常量指针)
常量成员函数中,this类型为 const X* const。 指向常量X 的常量指针。
7.
类的非静态数据成员可以申明为mutable,这将允许他们的值可以被该类的常量成员函数修改。
8.
Class (const Class&); //复制构造函数
Class& operator = (const Class &); //复制赋值操作符
virtual bool draw() const = 0; //纯虚函数
int (*fp) (); // 一个指针,指向一个返回值为int的函数
int (*ap1) [N]; //一个指针,指向一个具有N个int元素的数组
int *a1 [N]; //一个具有N个int*元素的数组
typedef void (*new_handle)(); //new_handle是一个指向这种函数的指针
// new_handle set_new_handle(new_handle);
//若不用typedef, 则等价为void (*set_new_handle(void(*))) ();
9.
指向类成员的指针并非指针
int C::* pimC; //一个指针,指向C的一个int成员
int a=12; ip = &a; *ip = 0; a = *ip;
l0.
获取非静态成员函数的地址时,得到的不是一个地址,而是一个指向成员函数的指针。
通常最佳方式是使用函数对象(function object)取代函数指针。(和智能指针一样,函数对象也是一个普通的类对象。智能指针类型重载->和*操作符,来模仿指针的行为;而函数对象类型则重载函数调用操作符(),来创建类似于函数指针的东西。)
当一个函数对象用作回调时,就是一个Command(命令)模式的实例函数对象可以封装数据,另一个好处是函数对象可以通过虚拟成员表现出动态行为。还有一个好处:可以处理类层次结构而不是较为原始的、缺乏灵活性的结构 。可将Prototype模式和Command模式组合,从而 产生可克隆的命令。
l1.
重载发生在同一个作用域内有两个或更多个函数具有相同的名字但签名不同时。函数的签名由它所声明的参数的数目和类型构成。重写发生于派生类函数和基类虚函数具有相同的名字和签名时。派生类函数的实现将会取代它所继承的基类函数的实现,以便满足对派生对象的虚拟调用。重写机制改变类的行为而不是改变其接口。
12.
指明对象不应该被分配到堆上的方式之一,是将其堆内存分配定位为不合法:
protected:
void * operator new (size_t) {return 0;}
void operator delete (void *) {}
private:
void * operator new[] (size_t); //阻止堆上分配类对象的数组
void operator delete[] (void *);
某些场合下,鼓励使用堆分配,为此,只需将析构函数声明为private即可。
13.
new和delete可重新定义为类的成员函数,new一个对象时,编译器首先会载类的作用域内查找一个
operator new, 若没找到,将会使用全局作用域中的operator new成员operator new和operator delete是静态成员函数,静态成员函数没有this指针
14.
分配和归还内存时保持数组和非数组形势的操作符的匹配:
T *aT = new T;//非数组 T* aryT = new T[12]; //数组
delete aT; delete [] aryT;
如果目的是不鼓励分配Handle数组,那么可以将数组形势的函数声明为私有的并且不提供定义
15.
异常是同步的
对象的销毁是异常安全的
交换操作不会抛出异常
异常的同步性:如果程序在某一点抛出了一个异常,那么在该异常被处理之前程序将不会继续往下执行,即程序执行流必须等待异常处理完成。谓之同步。
16.
RAII(resource acquisition is initialization)资源获取即初始化
RAII是一项很简单的技术。利用C++对象生命期的概念来控制程序的资源
基本原理:如果希望保持堆某个重要资源的跟踪,那么创建一个对象,并将资源的生命期和对象的生命期相关联。