13、在delete指针前对指针进行测试是没有必要的,例如:
[cpp]
在CODE上查看代码片派生到我的代码片
if(pi!=0)
delete pi;
//完全没有必要
但是在delete后,一定要将pi = 0.
14、定位new表达式:将对象创建在已经被分配好的内存中。形式:
new (place_address) type -specifier
使用这种new表达式,必须包含头文件<new>,这项设施允许程序员预分配大量的内存,供以后通过这种形式的new创建对象。例如:
[cpp]
在CODE上查看代码片派生到我的代码片
#include <iostream>
#include <new>
const int chunk = 16;
class Foo{
public:
Foo(){_val = 0;}
int val(){return _val;}
private:
int _val;
};
//预分配内存,但没有Foo对象
char *buf = new char[sizeof(Foo) * chunk];
int main()
{
//在buf中创建一个对象Foo
Foo *pb = new (buf) Foo;
//检查对象是否被放在buf中
if(pb->val() == 0){
cout 《 "new expression worded!" 《 endl;
}
//到这里不能使用pb
delete [] buf;
return 0;
}
//执行程序输出:new expression worded!
//注意两点:1、new出来的pb不用delete;2、delete buf时注意是[];
[cpp]
在CODE上查看代码片派生到我的代码片
int globalObj;
char buf2[1000];
void f(){
int *pi = &globalObj;
double *pd = 0;
float *pf = new float(0);
int *pa = new (buf2) int;
delete pi;//崩溃
delete pd;//ok,pd=0可以delete,如果声明为double *pd;delete时报错
delete pf;//ok
delete [] pa;//崩溃
}
[cpp]
在CODE上查看代码片派生到我的代码片
typedef int arr ;//定义一种类型,其包含10个整形的数组;
int *pa = new arr;
delete [] pa;//正确删除方法
15、待研究:auto_ptr、常量对象的动态分配与释放;
16、有时间回头看看第6章(抽象容器类型,尤其是他的操作文本的例子);12章泛型算法回头看看;
17、类中的非const成员变量不能在类体中显式的初始化;例如:
[cpp]
在CODE上查看代码片派生到我的代码片
class FC{
public:
static int si = 9;//错误
const int si0 = 7;//正确
const static int si1 = 8;//正确
int *pi = 0;//错误
double d = 0.0;//错误
};
18、友元(friend):允许一个类授权被声明为友元(friend)的函数(类)实现中访问本类的非公有成员;例如:
友元函数:
[cpp]
在CODE上查看代码片派生到我的代码片
class Foo{
friend int fu(Foo & fv);
public:
Foo():_value(15){}
private:
int _value;
};
int fu(Foo &fv)
{
return fv._value;
}
int main(void)
{
Foo *foo = new Foo();
cout 《 fu(*foo);
}
友元类:Query是NameQuery的基类
[cpp]
在CODE上查看代码片派生到我的代码片
class Query{
freiend class NameQuery;
public:
//…
}
现在NameQuery不但可以访问它自己的基类(Query)子对象的私有成员,而且还可以访问所有Query对象的私有和被保护的成员。
19、每个类对象都有自己的类数据成员拷贝,但是,每个类成员函数的拷贝只有一份。
20、在类体中定义的函数被自动作为inline函数处理。
21、把一个成员函数声明为const可以保证这个成员函数不能修改类的数据成员,但是如果该类含有指针,那么在const成员函数中能修改指针所指向的对象。例如:
[cpp]
在CODE上查看代码片派生到我的代码片
#include <cstring>
using namespace std;
class Text{
public:
void bad(const string &parm) const;
private:
char *_text;
};
void Text::bad(const string &parm) const
{
_text = parm.c_str();//错误,不能修改_text
for(int ix = 0; ix < parm.size(); ix++){
_text[ix] = parm[ix];//不好的风格,但是不是错误的
}
}