1 逗号操作符
逗号表达式是一组由逗号分隔的表达式,这些表达式从左向右计算。其结果是最右边表达式的值。而如果最右边操作数是左值,则逗号表达式的值也是左值。
istream& read(istream& in)
{
string s;
while (in>>s, !in.eof())
{
/* operate */
}
return in;
}
以上述程序为例,while循环的条件只有一个,就是检测输入流是否到了文件结尾(in.eof()),到文件结尾则循环结束。而in>>s并不参与条件的判断,其只是将输入流写到s里。
2 new和delete表达式
2.1动态创建对象
第四章讲过如何用new和delete动态创建和释放数组,其实也可以用于单个对象的动态创建和释放。
int name;
int *pi = new int; // pi points to dynamically allocated;
// unnamed, uninitialized in
动态创建对象只需要指明其类型,new表达式返回指向对象的指针。
/*初始化与数组部分相同。*/
2.2撤销创建的动态对象
通过delete表达式释放指针所指向的地址空间。
delete pi;
2.3delete之后重设指针的值
delete之后,指针pi所指向的内存被释放,因此pi不再有效。
该指针会变成垂悬指针,其指向曾经存放对象的内存,但该对象已经不存在。
此时再用pi去访问的内存已经不能保证其内容,所以在delete之后要将指针的值设为0,显式的指明其不指向任何对象。
pi = 0;
2.4const对象的动态分配与回收
动态创建的const对象必须在创建时初始化。
const int *pci = new const int(1024);
删除const对象。
delete pci;
3 强制转换
cast-name<type>(expression);
cast-name为dynamic_cast, const_cast, static_cast, reinterpert_cast之一。
type为目标转换类型。
expression为要进行强制转换的对象。
3.1 dynamic_cast
dynamic_cast支持运行时识别指针或引用所指向的对象。
3.2 const_cast
无法将一个非const的对象赋给一个const对象,const_cast实现去掉const属性。
3.3 static_cast
编译器隐式执行的任何类型转换都可以由static_cast显式完成。
int main()
{
int a = 2;
double c = 3.14;
cout << a * static_cast<int>(c) << endl;
return 0;
}
/* output */
/* 6 */
也可以通过static_cast找回存放在void*指针中的值。
int main()
{
double d = 97.28;
void* p = &d;
double* dp = static_cast<double*>(p);
cout << *dp << endl;
return 0;
}
3.4 reinterpret_cast
暂不涉及。