关于new
系统为每个程序都提供了一个在程序执行时可用的内存池 这个可用内存池被称为程序的空闲存储区[free store]或堆[heap]
类型指示符可以是内置类型或用户定义类型 new 表达式返回指向新分配的对象的指针, 例如
int *pi = new int;
如果一个对象被用作一组位或位域的离散集合 那么这样的对象称为 位向量 [bitvector ] 。位向量是一种用来记录一组项目或条件的是/否信息 有时也称为 标志 [flag] 的紧缩方法。
例如 在编译器中 类型声明的限定修饰符[qualifier],如 const 和 volatile 有时就被存储在位向量中 iostream 库用位向量表示格式状态
void*型指针
任何非const 数据类型的指针都可以被赋值给void*型的指针。void*型指针被用于”对象的确切类型未知“或者“在特定环境下对象的类型会发生变化”的情况。有时void*型的指针被称为泛型[generic]指针,因为它可以指向任意数据类型的指针。
int ival;
int *pi = 0;
char *pc = 0;
void *pv;
pv = pi; // ok: 隐式转换
pv = pc; // ok: 隐式转换
const int *pci = &ival;
pv = pci;// 错误 : pv不是一个 const void*.
const void *pcv = pci; // ok
关于类型转换
执行显式强制转换的第二个原因是希望改变通常的标准转换。例如,下列复合赋值首先将ival 提升成double 型,然后再把它加到dval 上,最后把结果截取成int 型来执行赋值
double dval;
int ival;
ival += dval;
我们通过显式地将dval 强制转换成int 型 消除了把ival 从int 型到double 型的不必要提升
ival += static_cast< int >( dval );
形式如下
cast-name< type >( expression );
这里的cast-name 是static_cast , const_cast, dynamic_cast 和reinterpret_cast 之一
const_cast 正如其名字所暗示的 将转换掉表达式的常量性 以及volatile 对象的volatile性 神马东西?
例如
extern char *string_copy( char* );
const char *pc_str;
char *pc = string_copy( const_cast< char* >( pc_str ));
试图用其他三种形式来转换掉常量性会引起编译错误 类似地 用const_cast 来执行类型转换 也会引起编译错误
编译器隐式执行的 任何类型转换都可以由static_cast 显式完成
double d = 97.0;
char ch = static_cast< char >( d );
旧式强制类型转换
前面给出的强制转换符号语法 有时被称为新式强制转换符号建议,只有当我们为C 语言或标准C++之前的编译器编写代码时才使用这种语法
旧式强制转换符号有下列两种形式
// C++强制转换符号
type (expr);
// C语言强制转换符号
(type) expr;
旧式强制转换可以用来代替标准C++中的
static_cast ,
cons_cast或
reinterpret_cast在标准C++之前 我们只能使用旧式强制转换 如果我们希望自己的代码在C++和C 语言中都能够编译的话,那么只能使用C 语言的强制转换符号
空语句
程序语句最简单的形式是空语句 形式如下 仅一个分号
; // 空语句
空语句被用在 程序的语法上要求一条语句,而逻辑上却不需要的时候。例如,在下面的while 循环中,把一个C 风格字符串拷贝到另一个字符串中去所需的全部处理过程。在这个语句的被称为 条件[condition] 的部分就已经完成了,但是 while 循环的格式要求条件。
后面跟一条语句 因为不需要再做其他的工作 所以我们用一条空语句来满足这个语法要求
while ( *string++ = *inBuf++ )
; // 空语句
意外出现的多余空语句不会产生编译错误 例如 下面的语句
ival = dval +sval;; // ok: 多余的空语句
复合语句
由一对花括号括起来的语句序列 复合语句被视为一个独立的单元 它可以出现在程序中任何单个语句可以出现的地方 复合语句不需要用分号作为结束 这是一种附加的语法上的便利 。 空复合语句与空语句等价,它为空语句提供了一种替代语法。例如
while ( *string++ = *inBuf++ )
{ } // 等价于空语句
if 语句
C++语言提供if 语句的动机是 根据指定的表达式是否为true ,有条件地执行一条语句或语句块。if 语句的语法形式如下
if ( condition )
statement
condition 条件 必须被放在括号内 它可以是表达式 如
if ( a + b > c ) { ... }
或是一条
具有初始化功能的声明语句 如
此条在as3中是不成立的
if ( int ival = compute_value() ) { ... }
空悬else[dangling-else]问题
if ( minVal <= ivec[ i ] )
if ( minVal == ivec[ i ] )
++occurs;
else {
minVal = ivec[ i ];
occurs = 1;
}
程序的缩进形式表明程序员相信else 应该与最外面的if 子句匹配,然而在C++中,空悬else 二义性由以下规定来解决:else 子句与最后出现的未被匹配的if 子句 相匹配。在本例中 if-else 语句实际的计算过程如下
if ( minVal <= ivec[ i ] ) {
// 空悬 else的解释结果
if ( minVal == ivec[ i ] )
++occurs;
else { minVal = ivec[ i ]; occurs = 1; }