1 放置语法。
void *buf = reinterpret_cast<void*>(0xF00F);
X *px = new (buf)X;//在‘buf’构造X时调用operator new (sizeof(X),buf)
由于这种使用方式,为了operator new 提供额外参数的new (buf) X的这种语法形式被称为放置语法。注意,每个new总是以对象的大小作为其第一个参数,而被分配对象的大小事隐式提供的。
内部code;
void *operator new (size_t sz, X *a)
{return a->alloc(sz);}
2 异常的描述
跑出或者捕捉异常也对一个函数或者其他函数的关系差生了影响。因此,将可能抛出的异常集合作为函数声明的一部分就有了价值了。
例如:
void f(int) throw(x2,x3)
说明f()只可能抛出2个异常x2 x3.,以及从这些类型派生的异常,但是不会抛出其他异常。
void f(int) throw(x2,x3)
{}
等价于
voidf()
try{
//
}
catch(x2){throw;}
catch(x3){throw;}
catch(...){
std::unexpected();//默认是这个,它通常将转而调用abort
}
如果一个函数声明中不带异常描述,他可能抛出任何异常。如int f()
不抛出任何异常的函数可以用空表声明 int g() throw();
3 对异常描述的检查
要去覆盖一个虚函数,这个函数所带的异常描述必须至少是于那个虚函数的异常描述一样受限的(显示的或者隐式的)。
和上面一样。你可以用一个指向更受限的异常描述的函数的指针,给一个指向带有不那么受限的异常描述的函数的指针赋值。
但是反过来不行。
void f() throw(X);
void(*pf1)()throw(X,Y) =&f;//ok
void(*pf2)()throw() =&f;//error.
4 auto_ptr 的破坏性复制语义也意味它不能盲足标准容器或者标准算法对元素的基本要求 、
例如:
vector<auto_ptr<Shape> >&v;//危险,在容器中使用auto_tpr
sort(v.begin(),v.end()); //这个排序可能造成v混乱。
5 多用 “ 资源申请即初始化”进行优美处理。