new表达式:string*sp = new string ("a value");
string *arr = newstring [10];
实际执行了三步操作:1.调用new的标准库函数2.调用构造函数并传入初值3.分配空间完成 返回一个指向该对象的指针
delete表达式:deletesp;
delete [] arr;
实际执行了两步操作:1.执行对应的析构函数2.调用delete标准库函数释放内存空间
::new和::delete调用全局的版本
void*operator new (size_t size);
void*operator new[](size_t size);
voidoperator delete (void* mem);
voidoperator delete [] (void* mem);
operator
new返回类型是void*第一个形参必须是size_t且该形参不能有默认实参
operator
delete返回类型是void第一个形参必须是void*
定义为类成员函数是它们是隐形的static无须声明为static声明也不会引发错误因此它们不能操纵类的任何数据成员。
void*operator new (size_t size)
{
if(void *mem = malloc(size))
return mem;
else
throw bad_alloc();
}
voidoperator delete (void* mem)
{
free(mem);
}
定位new表达式:new (place_address) type
new (place_address) type(initializers)
new (place_address) type [size]
new (place_address) type [size]{braced initializer list}
构造对象但不分配内存
虚析构函数
delete时 在基类中将析构函数定义成虚函数以确保执行正确的析构函数版本
命名空间(namespace)
防止名字冲突,不同的命名空间内可以有相同的成员
不能定义在函数或类内部
namespacecplusplus{
classsales_data{};
sales_dataoperator+{const sales_data&,const sales_data&};
classQuery{};
classQuery_base{};
}
以上代码定义了一个名为cplusplus的命名空间 包含四个成员:三个类和一个重载的+运算符
位于命名空间之外的代码则必须明确指出所用名字属于哪个命名空间
AddisonWesley::Queryq = AddisonWesley::Query(“hello”);
命名空间可以是不连续的
一般不把#include放在命名空间内
全局命名空间::member_name
未命名的命名空间拥有静态生命周期
int i;
namespace{
int i;//二义性
}