GeekBand C++第四周

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;//二义性

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容