表达式
C++ 还支持操作符重载,允许程序员自定义用于类类型时操作符的含义。
0 假 非0 真
对于位操作符,由于系统不能确保如何处理其操作数的符号位,所以强烈建议使用 unsigned 整型操作数。
j=++i:先把i加1,再赋值给j
j=i++:先把i給j,再i加1
由于后自增操作的优先级高于解引用操作,因此 *iter++ 等效于*(iter++)。
C++ 语言为包含点操作符和解引用操作符的表达式提供了一个同义词:箭头操作符(->)。
假设有一个指向类类型对象的指针(或迭代器),下面的表达式相互等价:
(*p).foo; // dereference p to get an object and fetch its member named
foo
p->foo;// equivalent way to fetch the foo from the object to which p points
sizeof 操作符的作用是返回一个对象或类型名的长度,返回值的类型为size_t
使用 sizeof 的结果部分地依赖所涉及的类型:
对 char 类型或值为 char 类型的表达式做 sizeof 操作保证得 1。
对引用类型做 sizeof 操作将返回存放此引用类型对象所需的内在空间
大小。
对指针做 sizeof 操作将返回存放指针所需的内在大小;注意,如果要获
取该指针所指向对象的大小,则必须对指针进行引用。
对数组做 sizeof 操作等效于将对其元素类型做 sizeof 操作的结果乘
上数组元素的个数。
其实,以什么次序求解操作数通常没有多大关系。只有当操作
符的两个操作数涉及到同一个对象,并改变其值时,操作数的
计算次序才会影响结果。
一个表达式里,不要在两个或更多的子表达式中对同一对象做
自增或自减操作。
new 和 delete 表达式
定义变量时,必须指定其数据类型和名字。而动态创建对象时,只需指定其
数据类型,而不必为该对象命名。取而代之的是,new 表达式返回指向新创建对
象的指针,我们通过该指针来访问此对象
int i;
int *pi = new int;
// named, uninitialized int variable
// pi points to dynamically allocated,
// unnamed, uninitialized int
值初始化的 () 语法必须置于类型名后面,而不是变量后
动态创建的对象用完后,程序员必须显式地将该对象占用的内存返回给自由
存储区。C++ 提供了 delete 表达式释放指针所指向的地址空间。
如果指针指向不是用 new 分配的内存地址,则在该指针上使用delete 是不合法的。
删除指针后,该指针变成悬垂指针。
悬垂指针指向曾经存放对象的内存,但
该对象已经不再存在了。悬垂指针往往导致程序错误,而且很难检测出来。
一旦删除了指针所指向的对象,立即将指针置为 0,这
样就非常清楚地表明指针不再指向任何对象。
内置类型对象或未提供默认构造函数的类类
型对象必须显式初始化。
C++ 定义了算术类型之间的内置转换以尽可能防止精度损失.
对于包含 signed 和 unsigned int 型的表达式,其转换可能出乎我们的意
料。表达式中的 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 通常为操作数的位模式提供较低层次的重新解释。
C++ 还支持操作符重载,允许程序员自定义用于类类型时操作符的含义。
0 假 非0 真
对于位操作符,由于系统不能确保如何处理其操作数的符号位,所以强烈建议使用 unsigned 整型操作数。
j=++i:先把i加1,再赋值给j
j=i++:先把i給j,再i加1
由于后自增操作的优先级高于解引用操作,因此 *iter++ 等效于*(iter++)。
C++ 语言为包含点操作符和解引用操作符的表达式提供了一个同义词:箭头操作符(->)。
假设有一个指向类类型对象的指针(或迭代器),下面的表达式相互等价:
(*p).foo; // dereference p to get an object and fetch its member named
foo
p->foo;// equivalent way to fetch the foo from the object to which p points
sizeof 操作符的作用是返回一个对象或类型名的长度,返回值的类型为size_t
使用 sizeof 的结果部分地依赖所涉及的类型:
对 char 类型或值为 char 类型的表达式做 sizeof 操作保证得 1。
对引用类型做 sizeof 操作将返回存放此引用类型对象所需的内在空间
大小。
对指针做 sizeof 操作将返回存放指针所需的内在大小;注意,如果要获
取该指针所指向对象的大小,则必须对指针进行引用。
对数组做 sizeof 操作等效于将对其元素类型做 sizeof 操作的结果乘
上数组元素的个数。
其实,以什么次序求解操作数通常没有多大关系。只有当操作
符的两个操作数涉及到同一个对象,并改变其值时,操作数的
计算次序才会影响结果。
一个表达式里,不要在两个或更多的子表达式中对同一对象做
自增或自减操作。
new 和 delete 表达式
定义变量时,必须指定其数据类型和名字。而动态创建对象时,只需指定其
数据类型,而不必为该对象命名。取而代之的是,new 表达式返回指向新创建对
象的指针,我们通过该指针来访问此对象
int i;
int *pi = new int;
// named, uninitialized int variable
// pi points to dynamically allocated,
// unnamed, uninitialized int
值初始化的 () 语法必须置于类型名后面,而不是变量后
动态创建的对象用完后,程序员必须显式地将该对象占用的内存返回给自由
存储区。C++ 提供了 delete 表达式释放指针所指向的地址空间。
如果指针指向不是用 new 分配的内存地址,则在该指针上使用delete 是不合法的。
删除指针后,该指针变成悬垂指针。
悬垂指针指向曾经存放对象的内存,但
该对象已经不再存在了。悬垂指针往往导致程序错误,而且很难检测出来。
一旦删除了指针所指向的对象,立即将指针置为 0,这
样就非常清楚地表明指针不再指向任何对象。
内置类型对象或未提供默认构造函数的类类
型对象必须显式初始化。
C++ 定义了算术类型之间的内置转换以尽可能防止精度损失.
对于包含 signed 和 unsigned int 型的表达式,其转换可能出乎我们的意
料。表达式中的 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 通常为操作数的位模式提供较低层次的重新解释。