【原创】c++学习笔记四
表达式
C++还支持操作符重载,允许程序员自定义用于类类型时操作符的含义。
0假非0真
对于位操作符,由于系统不能确保如何处理其操作数的符号位,所以强烈建议使用unsigned整型操作数。
j=++i:先把i加1,再赋值给j
j=i++:先把i給j,再i加1
由于后自增操作的优先级高于解引用操作,因此*iter++等效于*(iter++)。
C++语言为包含点操作符和解引用操作符的表达式提供了一个同义词:箭头操作符(->)。
假设有一个指向类类型对象的指针(或迭代器),下面的表达式相互等价:
(*p).foo;//dereferenceptogetanobjectandfetchitsmembernamed
foo
p->foo;//equivalentwaytofetchthefoofromtheobjecttowhichppoints
sizeof操作符的作用是返回一个对象或类型名的长度,返回值的类型为size_t
使用sizeof的结果部分地依赖所涉及的类型:
对char类型或值为char类型的表达式做sizeof操作保证得1。
对引用类型做sizeof操作将返回存放此引用类型对象所需的内在空间
大小。
对指针做sizeof操作将返回存放指针所需的内在大小;注意,如果要获
取该指针所指向对象的大小,则必须对指针进行引用。
对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘
上数组元素的个数。
其实,以什么次序求解操作数通常没有多大关系。只有当操作
符的两个操作数涉及到同一个对象,并改变其值时,操作数的
计算次序才会影响结果。
一个表达式里,不要在两个或更多的子表达式中对同一对象做
自增或自减操作。
new和delete表达式
定义变量时,必须指定其数据类型和名字。而动态创建对象时,只需指定其
数据类型,而不必为该对象命名。取而代之的是,new表达式返回指向新创建对
象的指针,我们通过该指针来访问此对象
inti;
int*pi=newint;
//named,uninitializedintvariable
//pipointstodynamicallyallocated,
//unnamed,uninitializedint
值初始化的()语法必须置于类型名后面,而不是变量后
动态创建的对象用完后,程序员必须显式地将该对象占用的内存返回给自由
存储区。C++提供了delete表达式释放指针所指向的地址空间。
如果指针指向不是用new分配的内存地址,则在该指针上使用delete是不合法的。
删除指针后,该指针变成悬垂指针。
悬垂指针指向曾经存放对象的内存,但
该对象已经不再存在了。悬垂指针往往导致程序错误,而且很难检测出来。
一旦删除了指针所指向的对象,立即将指针置为0,这
样就非常清楚地表明指针不再指向任何对象。
内置类型对象或未提供默认构造函数的类类
型对象必须显式初始化。
C++定义了算术类型之间的内置转换以尽可能防止精度损失.
对于包含signed和unsignedint型的表达式,其转换可能出乎我们的意
料。表达式中的signed型数值会被转换为unsigned型。
在使用数组时,大多数情况下数组都会自动转换为指向第一个元素的指针
不将数组转换为指针的例外情况有:数组用作取地址(&)操作符的操作数
或sizeof操作符的操作数时,或用数组对数组的引用进行初始化时,不会将数
组转换为指针。
C++还提供了另外两种指针转换:指向任意数据类型的指针都可转换为
void*类型;整型数值常量0可转换为任意指针类型。
当使用非const对象初始化const对象的引用时,系统将非const对象
转换为const对象。
显式转换也称为强制类型转换(cast),包括以下列名字命名的强制类型转换操
作符:static_cast、dynamic_cast、const_cast和reinterpret_cast。
dynamic_cast支持运行时识别指针或引用所指向的对象。
const_cast将转换掉表达式的const性质。
编译器隐式执行的任何类型转换都可以由static_cast显式完成
当需要将一个较大的算术类型赋值给较小的类型时,使用强制转换非常有
用。
reinterpret_cast通常为操作数的位模式提供较低层次的重新解释。