《C++ Primer》读书笔记(4.9,4.11,4.14,5.1,5.3)

关于new   

 系统为每个程序都提供了一个在程序执行时可用的内存池 这个可用内存池被称为程序的空闲存储区[free store]或[heap] 

类型指示符可以是内置类型或用户定义类型 new 表达式返回指向新分配的对象的指针,    例如 

        int *pi = new int; 


位向量
如果一个对象被用作一组位或位域的离散集合 那么这样的对象称为位向量 [bitvector ] 。位向量是一种用来记录一组项目或条件的是/否信息 有时也称为标志 [flag]  的紧缩方法。
例如 在编译器中 类型声明的限定修饰符[qualifier],如constvolatile 有时就被存储在位向量中 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-namestatic_cast  , const_cast dynamic_castreinterpret_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_castreinterpret_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; } 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章