【原创】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通常为操作数的位模式提供较低层次的重新解释。

相关推荐