以下笔记按在书中出现的先后顺序来记载:
P6 cout<<std:endl; 是刷新输出流缓冲区的方法之一。及时刷新缓冲区,能避免调试程序时如果程序崩溃我们对出错位置的错误判断。
P7 一般出现空格符的地方都可以用换行符替代,只有两个例外:一是预处理指示中,二是字符串文字量中。
P23 默认情况下,读cin或程序结束时,都会刷新cout。cerr不带缓冲,clog则带。
P23 表达式是最小的计算单元,通常含有一个或多个操作数,并通常含有一个操作符。
P30 C++标准规定了每个算术类型的最小存储空间,但是不阻止编译器使用更大的存储空间。对于int,几个每个编译器都使用比标准规定的存储空间大的空间。
P30 C++算术类型共9种,其中整型6种,浮点型3种。
P31 int, short,long都默认为带符号型。而char则是由编译器决定默认是否带符号。在VC7中,char默认也是带符号的。
P32 unsigned 默认表示unsigned int。
P32 signed类型如何取值,如何用位来表示是依赖于编译器的。
P32 如果被赋予超过取值范围的值,一般编译器不会报非法,而是对对象取模,比如将-1赋予unsigned对象,得255。(-1对256取模后的值)。但也有编译器不是这样实现的。
P33 对标准库的计算建议使用size_type,浮点型计算建议使用double。
P33 大多数机器使用与long相似的32位来表示int;某些机器上,用double计算比float计算要快。
P34 只有内置类型存在字面值literal constant;换句话说,任何字面值都必然属于某个内置类型。
P35 对于字面值,整型的可以在后面加L或U,前面加0或0X;浮点型可以在后面加L,f或E;字符型的可以在前面加L。
P41 C++共有63个关键字。
P42 一般来说,“直接初始化”(圆括号的初始化)比“复制初始化”(用等号的初始化)更灵活和效率更高。
P45 建议每个内置类型的变量都要初始化,虽然这样做有时候不是必须的。
P46 带初始化值的声明被认为是定义。
P48 在对象第一次被使用的地方才定义对象,可以提高程序的可读性。
P50 重要:非const变量默认就是extern的,但const常量默认却是局部于它所在的文件的(目的是当它们是被常量表达式所初始化时,能被放到头文件中,见P59)。所以,要想像让const常量获得像普通变量那样的作用域,必须在它的初始化式的前面加上extern。
P51 引用是一种复合类型,“复合类型”是指用其他类型定义的类型。
除了不能定义引用类型的引用外,可以定义其它任何类型的引用。
引用必须用与该引用同类型的对象来初始化。
引用不能被重绑定到另一对象。
引用只是它绑定的对象的别名,任何作用在引用上的操作,实际都是作用在它绑定的对象上。
P52 只有const引用才可以用常量值或不同类型的变量初始化。非const引用则不可以。
P53 枚举的主要作用是定义一组整数常量集,同时指出它们是关联的。
P54 枚举成员值可以是不唯一的。
每个enum语句都定义了一种惟一的类型。对它的使用方式类似于类类型的普通变量。
P55 class和struct的惟一区别是前者的访问级别默认为private,后者则默认为public。
P59 头文件不应该含有定义,但有三个例外:一是const常量,二是inline函数,三是类头的定义。
P59 被常量表达式所初始化的const常量应该放到头文件中,否则则不然。
P61 可以用定义在头文件里的实体(比如类)名来命名预处理器变量,来避免预处理器变量重名的问题,从而避免头文件内容的重复包含,比如 #ifndef SALESITEM_H
P63 复合类型是指通过其他类型定义的类型,比如:引用,指针和数组。
P64 对象是具有类型的一段内存区域,变量则是有名字的对象。
P64 预处理器继承自C语言,C++的特征大量减少了它的使用,但仍然保留一个很重要的用法:#include
P64 作用域是程序的一部分,在其中的名字有意义(能起作用)。C++共有6种作用域,由小到大为:语句(如if),块(大括号中),局部(也称函数内),命名空间(指namespace大括号内),类(类体的大括号中),全局(在任何以上五种作用域以外的,也称文件?)
作用域可以嵌套,即在大的作用域中声明的名字在小作用域中依然有效。
P65 C++是一种静态类型语言,意思是它是在编译时进行类型检查的语言,在编译时验证表达式中出现的所有类型,是否可以执行它所需要的操作。变量在使用前必须被声明或定义。
P65 “word(字)”是在给定机器上进行整型计算的原始单元。通常一个字足以容纳一个地址。典型地,对于一个32位的机器来说,一个字是4个字节。
P67 标准库中其中两种最重要的类型是:string 和vector,它们分别定义了大小可变的字符串和集合。它们往往将迭代器用作伴随类型,用于访问自身中的元素。
P69 在头文件中应该总是使用带名字空间限定的名字,比如std::cout。(意思是带限定的方式是对名字空间污染比较小的方式了,比起 using namespace std;来说。而头文件因为“其内容会完全拷贝到包含它的文件中”,所以应该取污染比较小的方式。)
P72 getline()函数的用处之一是读入输入流中有效字符之前的空白字符。
P73标准类型中常见的成员size_type比起unsigned的优势是,它是与机器无关的。所以,在作为下标/索引,或存储大小时,都建议用它,比如:
string::size_type ix;
s1[ix]=’*’;
ix=s1.size();
P74 多数计算机上,涉及到字符串比较中的单个字符时,大写字母小于小写字母。
P75 表达式计算时要考虑到结合性(比如是左结合(从左到右)还是右结合),
如下两个赋值语句:
string s1;
string s2 = s1 + “a” + “b”;
string s3= “a” + “b” + s1;
前者是合法的,后者则否;原因正在于string中的“ + ”号操作符是左结合的。
P78 C++标准库除了定义了特定于C++本身的一些库外,还包含了C标准库。C标准库原来的头文件的名称为.h,在C++中命名为<cxxx>,并被包含于名字空间std的域内。
P79 vector是一个类模板,vector才是一种数据类型。
P80 重要:对于vecotr,比起对给定个数的它预先分配内存,更有效的方法是先初始化一个空的vector元素,再动态地往里面添加元素。
P82 C++程序员习惯于优先使用!=而不是<作为循环的判断条件。这个习惯来自于泛型编程,有其合理性。
P82 在循环判断中动态地调用size()而不是提前调用并保存其值,同样有其合理性。因为有些数据结构比如vector是可以在循环中动态增长的。
P84 在标准库中,只有少数的容器(比如vector)支持下标操作,而所有容器都支持迭代器(都定义一个名为iterator的类型)。因此,建议优先使用迭代器。
P86 const_iterator是一个指向常量的iterator。
P87 difference_type的作用与size_type类似,区别在于它是signed型而已。
P88 任何改变vector长度的操作,都会使已存在的迭代器失效。
P88 bitset与vector类似都是一个类模板,不过它各个对象之间的区别在于大小而不在于类型,比如bitset<32> bitvec;
P89 bitset匹配时是从低阶开始匹配的。
(未完待续)
---------------------------------
以下个人勘误按在书中出现的先后顺序来记载:
P13(第13页) “不是所有编译器都有这一要求”后半句应翻译为“都满足这一标准”。
影响阅读程度:严重
说明:“编译器”如何能“要求”C++标准?原英文版中的“enforce”应翻译为“满足”而不是“有”,动宾关系才不会搞反。
P43 “有多个初始化式时不能使用复制初始化”前半句应翻译为“有多个初始化参数时”。
影响程度:一般
P45 “如果定义某个类的变量时没有提供初始化式….”这句和后一句应翻译为“如果定义某个类的变量时没有提供初始化参数,那么系统会调用该类的’缺省构造函数’。”
影响程度:一般
P50 有三处的“const变量”翻译为“const常量”或“const对象”比较好,虽然原英文版有两处也是用const variable。
影响程度:轻微
P52 “仅允许const引用绑定到需要临时使用的值”应翻译为“仅允许const引用绑定到需要临时值中转来完成绑定过程的对象”
影响程度:严重
说明:译者对宾语的主体理解错误。原英文版中的“临时使用的值”是用来修饰value(对象)的,不是最终的宾语。
因为对于程序员来说,编译器做的中转工作是透明的,const引用最终还是绑定到对象,虽然结果相同。
P65 “word(字)机器上的自然的整型计算单元”应翻译为“word(字)是在给定机器上进行整型计算的原始单元”
影响程度:一般
P79 “v4含有值初始化的元素”这句应翻译为“v4含有n个用缺省构造函数中的值初始化的元素”
影响程度:严重
P79 “动态地添加元素”这句应翻译为“当元素值已知时,最好是通过动态地向它添加元素,来让它增长。”
影响程度:一般
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/SearchLife/archive/2008/12/10/3490669.aspx