第一部分 基本语言

来源:互联网 发布:淘宝店铺招牌制作教程 编辑:程序博客网 时间:2024/04/29 06:03

1.对于实际的程序来说,float 类型精度通常是不够的——float 型只能保证 6 位有效数字,而 double 型至少可以保证 10 位有效数字,能满足大多数计算的需要。
2.注意反斜线符号必须是该行的尾字符——不允许有注释或空格符。同样,后继行行首的任何空格和制表符都是字符串字面值的一部分。正因如此,长字符串字面值的后继行才不会有正常的缩进。
3.在数值的后面加上 F 或 f 表示单精度。同样加上 L 或者 l 表示扩展精度
4.在 C++ 中,操作是否合法是在编译时检查的。
5.左值(发音为 ell-value):左值可以出现在赋值语句的左边或右边。
 右值(发音为 are-value):右值只能出现在赋值的右边,不能出现在赋值语句的左边。
6.对象就是内存中具有类型的区域。
7.内置类型变量是否自动初始化取决于变量定义的位置。在函数体外定义的变量都初始化成 0,在函数体里定义的内置类型变量不进行自动初始化。
8.不管变量在哪里定义,默认构造函数都会被使用。
9.有些类类型没有默认构造函数。对于这些类型来说,每个定义都必须提供显式的初始化式。没有初始值是根本不可能定义这种类型的变量的。
10.extern 声明不是定义,也不分配存储空间。事实上,它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次。
11.在全局作用域声明的 const 变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。
12.非 const 变量默认为 extern。要使 const 变量能够在其他的文件中访问,必须地指定它为 extern。
13.在引用的情况下,每一种引用类型都“关联到”某一其他类型。不能定义引用类型的引用,但可以定义任何其他类型的引用。
14.需要规定将普通的引用绑定到 const 对象是不合法的。
15.const 引用可以初始化为不同类型的对象或者初始化为右值.同样的初始化对于非 const 引用却是不合法的,而且会导致编译时错误。
16.定义变量和定义数据成员存在非常重要的区别:一般不能把类成员的初始化作为其定义的一部分。当定义数据成员时,只能指定该数据成员的名字和类型。类不是在类定义里定义数据成员时初始化数据成员,而是通过称为构造函数(第 2.3.3 节)的特殊成员函数控制初始化。
17.用 class 和 struct 关键字定义类的唯一差别在于默认访问级别:默认情况下,struct 的成员为 public,而 class 的成员为 private。
18.头文件为相关声明提供了一个集中存放的位置。头文件一般包含类的定义、extern 变量的声明和函数的声明。
19.对于头文件不应该含有定义这一规则,有三个例外。头文件可以定义类、值在编译时就已知道的 const 对象和 inline 函数
20.如果头文件名括在尖括号(< >)里,那么认为该头文件是标准头文件。编译器将会在预定义的位置集查找该头文件,这些预定义的位置可以通过设置查找路径环境变量或者通过命令行选项来修改。如果头文件名括在一对引号里,那么认为它是非系统头文件,非系统头文件的查找通常开始于源文件所在的路径。
21.一个 using 声明一次只能作用于一个命名空间成员。
22.string 类型的输入操作符:
  读取并忽略开头所有的空白字符(如空格,换行符,制表符)。
  读取字符直至再次遇到空白字符,读取终止。
23.C 标准库头文件命名形式为 name 而 C++ 版本则命名为 cname ,少了后缀,.h 而在头文件名前加了 c 表示这个头文件源自 C 标准库。因此,cctype 与 ctype.h 文件的内容是一样的,只是采用了更适合 C++程序的形式。特别地,cname 头文件中定义的名字都定义在命名空间 std 内,而 .h 版本中的名字却不是这样。
24.虽然可以对给定元素个数的 vector 对象预先分配内存,但更有效的方法是先初始化一个空 vector 对象,然后再动态地增加元素.
25.使用 const_iterator 类型时,我们可以得到一个迭代器,它自身的值可以改变,但不能用来改变其所指向的元素的值。可以对迭代器进行自增以及使用解引用操作符来读取值,但不能对该元素赋值。
26.string 对象和 bitsets 对象之间是反向转化的:string 对象的最右边字符(即下标最大的那个字符)用来初始化 bitset 对象的低阶位(即下标为 0 的位)。
27.数组定义中的类型名可以是内置数据类型或类类型;除引用之外,数组元素的类型还可以是任意的复合类型。没有所有元素都是引用的数组。
28.C++ 提供了一种特殊的指针类型 void*,它可以保存任何类型对象的地址.
29.C++ 允许计算数组或对象的超出末端的地址,但不允许对此地址进行解引用操作。
30.如果指向 const 的指针所指的对象并非 const,则可直接给该对象赋值或间接地利用普通的非 const 指针修改其值:毕竟这个值不是 const。重要的是要记住:不能保证指向 const 的指针所指对象的值一定不可修改。
31.每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区或堆。
32.C++ 虽然不允许定义长度为 0 的数组变量,但明确指出,调用 new 动态创建长度为 0 的数组是合法的:
33.int *ip[4]; // array of pointers to int         ip一个指向int的指针,但是由4个组成一个数组。
   int (*ip)[4]; // pointer to an array of 4 ints  ip 是一个指向含有 4 个元素的数组的指针。
34.求模的操作数只能为整型,包括 bool、char、short 、int 和 long 类型,以及对应的 unsigned 类型:
35.除法操作的结果为正数(或零),而求模操作的结果则为负数(或零);如果只有一个操作数为负数,这两种操作的结果取决于机器;求模结果的符号也取决于机器,而除法操作的值则是负数(或零).
36.左移操作符(<<)在右边插入 0 以补充空位。对于右移操作符(>>),如果其操作数是无符号数,则从左边开始插入 0;如果操作数是有符号数,则插入符号位的副本或者 0 值,如何选择需依据具体的实现而定。移位操作的右操作数不可以是负数,而且必须是严格小于左操作数位数的值。否则,操作的效果未定义。
37.移位操作符具有中等优先级:其优先级比算术操作符低,但比关系操作符、赋值操作符和条件操作符优先级高。
38.这两种语法形式存在一个显著的差别:使用复合赋值操作时,左操作数只计算了一次;而使用相似的长表达式时,该操作数则计算了两次,第一次作为右操作数,而第二次则用做左操作数。
39.前置操作返回加1后的值,所以返回对象本身,这是左值。而后置操作返回的则是右值。
40.除了逻辑与和逻辑或外,C++ 没有明确定义二元操作符的求解次序,编译器可自由地提供最佳的实现方式。
41.值初始化的 () 语法必须置于类型名后面,而不是变量后。
42.C++ 保证:删除 0 值的指针是安全的。
43.一旦删除了指针所指向的对象,立即将指针置为 0,这样就非常清楚地表明指针不再指向任何对象。
44.显式转换也称为强制类型转换(cast),包括以下列名字命名的强制类型转换操作符:static_cast、dynamic_cast、const_cast 和 reinterpret_cast。
45.寻找处理代码的过程与函数调用链刚好相反。抛出一个异常时,首先要搜索的是抛出异常的函数。如果没有找到匹配的 catch,则终止这个函数的执行,并在调用这个函数的函数中寻找相配的 catch。如果仍然找到相应的处理代码,该函数同样要终止,搜索调用它的函数。如此类推,继续按执行路径回退,直到找到适当类型的 catch 为止。
46.在调用函数时,如果该函数使用非引用的非 const 形参,则既可给该函数传递 const 实参也可传递非 const 的实参。
47.应该将不需要修改的引用形参定义为 const 引用。普通的非 const 引用形参在使用时不太灵活。这样的形参既不能用 const 对象初始化,也不能用字面值或产生右值的表达式实参初始化。
// swap values of two pointers to int
void ptrswap(int *&v1, int *&v2)
{
    int *tmp = v2;
    v2 = v1;
    v1 = tmp;
}
int main()
{
    int i = 10;
    int j = 20;
    int *pi = &i;  // pi points to i
    int *pj = &j; // pj points to j
    cout << "Before ptrswap():/t*pi: "
         << *pi << "/t*pj: " << *pj << endl;
    ptrswap(pi, pj); // now pi points to j; pj points to i
    cout << "After ptrswap():/t*pi: "
         << *pi << "/t*pj: " << *pj << endl;
    return 0;
}
48.当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组元素的类型时是否匹配,而不会检查数组的长度。
49.通常,应在函数声明中指定默认实参,并将该声明放在合适的头文件中。
50.内联函数应该在头文件中定义,这一点不同于其他函数。
51.const 对象、指向 const 对象的指针或引用只能用于调用其 const 成员函数,如果尝试用它们来调用非 const 成员函数,则是错误的。
52.函数指针只能通过同类型的函数或函数指针或 0 值常量表达式进行初始化或赋值。
53.下面几种情况将导致缓冲区的内容被刷新,即写入到真实的输出设备或者文件:
(1)程序正常结束。作为 main 返回工作的一部分,将清空所有输出缓冲区。
(2)在一些不确定的时候,缓冲区可能已经满了,在这种情况下,缓冲区将会在写下一个值之前刷新。
(3)用操纵符(第 1.2.2 节)显式地刷新缓冲区,例如行结束符 endl。
(4)在每次输出操作执行完后,用 unitbuf 操作符设置流的内部状态,从而清空缓冲区。
(5)可将输出流与输入流关联(tie)起来。在这种情况下,在读输入流时将刷新其关联的输出缓冲区。