(c++ primer)unit5-表达式

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(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(c) << endl;

	return 0;
}

/* output */
/* 6 */

也可以通过static_cast找回存放在void*指针中的值。

int main()
{
	double d = 97.28;
	void* p = &d;
	double* dp = static_cast(p);
	cout << *dp << endl;
	return 0;
}

3.4 reinterpret_cast

暂不涉及。

 

 

 

你可能感兴趣的:(c++,primer)