c++ primer 11

  在算数表达式中,不要使用char或bool,只有在存放字符或布尔值时才使用它们。因为类型char在一些机器上是有符号的,而在另一些机器上又是无符号的,所以如果使用char进行运算特别容易出问题。如果你需要使用一个不大的整数,那么明确指定它的类型是signed char或者unsigned char。

  执行浮点数运算选用double,这是因为float通常精度不够而且双精度浮点数和单精度浮点数的计算代价相差无几。事实上,对于某些机器来说,双精度运算甚至比单精度还快。

  整型字面值具体的数据类型由它的值和符号决定。默认情况下,十进制字面值是带符号数,八进制和十六进制字面值既可能是带符号的也可能是无符号的。十进制字面值的类型是int, long和long long中尺寸最小的那个(例如,三者当中最小的是int), 当然前提是这种类型要能容纳下当前的值。八进制和十六进制字面值的类型是能容纳其数值的int, unsigned int, long, unsigned long, long long 和 unsigned long long 中尺寸最小者。如果一个字面值连与之关联的最大的数据类型都放不下,将产生错误。类型short没有对应的字面值。我们以后缀代表相应的字面值类型。

  我们也可以使用泛化的转义序列,其形式是\x后紧跟1个或多个十六进制数字,或者\后紧跟1个、2个或3个八进制数字,其中数字部分表示的是字符对应的数值。注意,如果反斜线\后面跟着的八进制数字超过3个,只有前3个数字与\构成转义序列。例如,"\1234"表示2个字符,即八进制数123对应的字符以及字符4。相反,\x要用到后面跟着的所有数字,例如, “\1234”表示一个16位的字符,该字符由这4个16进制数表示。

    wchar_t wChar[] = L"hello";
    wcout << wChar << endl;

    char char8[] = u8"hello";
    char16_t char16[] = u"hello";
    char32_t char32[] = U"hello";

   如果是内置类型的变量未被显式初始化,它的值由定义的位置决定。定义于任何函数体之外的变量被初始化为0。然而如6.1.1节所示,一种例外情况是,定义在函数体内部的内置类型变量将不被初始化。一个未被初始化的内置类型变量的值是未定义的。

  在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误。

   用户自定义的标识符不能连续出现两个下划线,也不能以下划线紧连大写字母开头。此外,定义在函数体外的标识符不能以下划线开头。

  用户自定义的类名一般以大写字母开头。

  引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起。引用并非对象,相反的,它只是为一个已经存在的对象所起的另外一个名字。因为引用不是对象,没有实际地址,所以不能定义指向引用的指针。

   引用的类型必须与其所引用对象的类型一致,但是有两个例外。第一种例外情况就是在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。尤其,允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式:

   在名为cname的头文件中定义的名字从属于命名空间std, 而定义在名为.h的头文件中的则不然。

  vector是模板而非类型,由vector生成的类型必须包含vector中元素的类型,例如vector<int>。

  如果循环体内部包含有向vector对象添加元素的语句,则不能使用范围for循环。

  对于vector,只能对明确已存在的元素执行下表操作,不能使用下标添加新元素,可以修改元素。
  如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器。

   只有string和vector等一些标准库类型有下标运算符,而并非全都如此。与之类似,所有标准库容器的迭代器都定义了==和!=,但是它们中的大多数都没有定义<运算符。因此,只要我们养成使用迭代器和!=的习惯,就不用太在意用的到底是哪种容器类型。

   如果对象是常量,begin和end返回const_iterator;如果对象不是常量,返回iterator

  为了便于专门得到const_iterator类型的返回值,c++11新标准引入了两个函数,分别是cbegin和cend。

  虽然vector对象可以动态地增长,但是也会有一些副作用。已知的一个限制是不能在范围for循环中向vector对象添加元素。另外一个限制是任何一种可能改变vector对象容量的操作,比如push_back,都会使该vector对象的迭代器失效。
  谨记,但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。

  我们无法保证c_str()函数返回的数组一直有效,事实上,如果后续的操作改变了string对象的值可能让之前返回的数组失去效用。如果执行完c_str()函数后程序想一直都能使用其返回的数组,最好将该数组重新拷贝一份。

  进行比较运算时除非比较的对象是布尔类型,否则不要使用布尔字面值true和false作为运算对象。

  自增自减:前置版本将对象本身作为左值返回,后置版本则将对象原始值的副本作为右值返回。

posted @ 2015-03-06 11:08  挨踢淫才  阅读(363)  评论(0编辑  收藏  举报