1.箭头操作符
如果p是一个指向对象的指针,(*p).foo;等价于p->foo;
2.条件运算符
cond?expr1:expr2;
(1)避免使用条件运算符的深度嵌套
(2)在输出表达式中使用条件操作符
3.sizeof操作符
sizeof操作符的作用是返回一个对象或类名的长度,返回值类型为size_t。
对数组做sizeof操作符等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数。
int sz = sizeof(ia)/sizeof(*ia);
4.逗号操作符
逗号表达式是一组由逗号分隔的表达式,这些表达式从左向右计算。
5.new 和 delete表达式
new和delete表达式动态创建和释放数组,这两种表达式也可以用于创建和释放单个对象。
(1)动态创建duixiang 的初始化
int i(1024);
int *pi = new int(1024);
string s(10,'9');
string *ps = new string(10,'9');
(2)动态创建对象的默认初始化
int *pi = new int;//内置类型的对象无初始化
string *ps = new string;//调用类的默认构造函数初始化
除了对其赋值之外,对未初始化的对象所关联的值的任何使用都是没有定义的。
int *pi = new int; //无初始化
int *p1 = new int(); //初始化为0
6.撤销动态创建的对象
动态创建的对象用完后,程序员必须显式地将该对象占用的内存返回给自由存储区。
int *p1 = new int();//初始化为0
delete p1;
注意:如果指针指向不是用new分配的内存地址,则在该指针上使用delete是不合法的。
如果指针的值为0,则在其上做delete操作是合法的,但这样做没有任何意义:
int *ip = 0;
delete ip;
C++保证,删除0值的指针是安全的。
7.在delete之后,重设指针的值
delete p;之后,P变成没有定义。在很多机器上,尽管p没有定义,担仍然存放了它之前所指向对象的地址,然而p所指向的内存已经被释放,因此p不再有效。删除指针后,该指针变成悬垂指针。悬垂指针指向曾经存放对象的内存,但该对象已经不再存在了。悬垂指针往往导致程序错误,而且很难检测出来
注意:一旦删除了指针所指向的对象,立即将指针置为0,这样就非常清楚地表明指针不再指向任何对象。
8.类型转换
显示转换:也叫强制类型转换(cast),包括以下名字命名的强制类型转换操作符:static_cast、dynamic_cast、const_cast和reinterpret_cast。虽然有时候需要强制类型转化,但是它们本质上是非常危险的。const_cast将转换掉表达式的const性质。
建议:避免使用强制类型转换。
虽然标准C++仍然支持旧式强制类型转换,但是我们建议,只有在C语言或标准C++之前的编译器编写代码时,才使用这种语法。 char *pc = (char*) ip;