C++ Primer中文版读书笔记

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情


(注意,Lm 表示第 m 行,L-n 表示倒数第 n 行)

■导读 p23
原文:
template <typename T>
T func( T p1, T p2, int p3 ) // ( T p1, T p2, int p3 ) 称为 template parameter list
{     ...     }              // p1, p2 称为型别参数(type parameter)
                             // p3 称为非型别参数(nontype parameter)
更正:
template <typename T>        // <typename T> 称为 template parameter list
T func( T p1, T p2, int p3 ) //   其中 T 是 template type parameter(型别参数)
{     ...     }              //   另有所谓 template nontype parameter(非型别参数),
                             //   本例未出现。

■p36 L-2
原文:当它後面紧跟着一个 class 名称
更正:当它紧跟着一个 class 名称後面

■p106 L17(原书笔误)
原文:int *&ptrVal2 = pi;
更正:int *&refPtr = pi;

■p342: L-4(原书笔误)
原文:以下示范利用 rswap() 交换两个指标
更正:以下示范利用 ptrswap() 交换两个指标

■p496: L13
原文:inline 或 extern 修饰词应该放在 template 参数列之前,而非┅
更正:inline 或 extern 修饰词应该放在 template 参数列之後,而非┅

■p1130: copy_backward() 下的第二段文字(原书错误)
原文:
例如,数列 {0,1,2,3,4,5},我们可以复制最后三个元素 (3,4,5) 到
最前三个元素 (0,1,2) 身上,作法是将 first 设定为元素 0 的位址,
last1 设定为元素 3 的位址,last2 设定为元素 5 的下一个位址。
于是元素 5 会被指定到原来的元素 2 身上,元素 4 会被指定到原来的元素 1 身上,
元素 3 会被指定到原来的元素 0 身上。最后的结果是 {3,4,5,3,4,5}。

更正:
例如,数列 {0,1,2,3,4,5},我们可以复制最前三个元素 (0,1,2) 到
最后三个元素 (3,4,5) 身上,作法是将 first 设定为元素 0 的位址,
last1 设定为元素 3 的位址,last2 设定为元素 5 的下一个位址。
于是元素 2 会被指定到原来的元素 5 身上,元素 1 会被指定到原来的元素 4 身上,
元素 0 会被指定到原来的元素 3 身上。最后的结果是 {0,1,2,0,1,2}。

================================================================

三刷更正内容:
(注意,Lm 表示第 m 行,L-n 表示倒数第 n 行)

■p252 图片过于粗糙,重制。

■p318 最后一段第二行(误译)
原文:这种作法之所以能够成功,是因为这些 containers 保证其
      元素实体会以连续的方式出现(存在)。
更正:这种作法之所以能够成功,是因为这些 containers 保证其
      键值相同的元素会连续出现(存在)。

■p322 最后一段第二行(修润)
原文:我们称 stack 为一种所谓的 container adapter,因为它
      在底层的 container 集合体身上课徵 stack 抽象性质。
更正:我们称 stack 为一种所谓的 container adapter,因为它
      系利用底层各类型 container 加工完成 stack 抽象性质。

■p495, L4(原书笔误)
原文:// ok: Type used many times in template parameter list
更正:// ok: Type used many times in function parameter list


■p501, L12(中译本误植)
原文:min2() 的第一个函式参数是个型别为 *Type 的指标。
更正:min2() 的第一个函式参数是个型别为 Type* 的指标。

■p503, L-5(原书笔误)
原文:上述的 template 引数 T 从第一个函式引数中推导得 int,
      又自第二个函式引数中推导得 unsigned int,因此 template 引数推导失败。
更正:上述的 template 引数 T 从第一个函式引数中推导得 unsigned int,
      又自第二个函式引数中推导得 int,因此 template 引数推导失败。
感谢:leetron

■p565, L7(原书笔误)
原文:Exception declaration 是函式介面的一部份,所以它必须...
更正:Exception specification 是函式介面的一部份,所以它必须...

■p576, 最上(中译稿漏印,缺少两个右大括号)
原文:     // ...
更正:     }
           // ...
       }

■p595, L-5
原文:当然,「令一个 non-const iterator 指向一个 const iterator」总是可以的。
更正:当然,「将一个 non-const iterator 指派给一个 const iterator」总是可以的。

■p596(原书笔误)
说明:本页下方有三点,讨论 back_inserter, front_inserter, inserter.
      并均利用 unique_copy() 做为使用范例。每一个 unique_copy() 都
      遗漏了最后的右大括弧。
更正:请为 unique_copy() 加上最后的右大括弧。

■p652, L-1(中译稿漏印,少了最后一行)
原文:有着以下的型别:
更正:有着以下的型别: int (Screen::*)()

■p731, 第一段(中译误失)
原文:
举个例子,如果我再次修改 Account class 的定义,令 _name 的型别为 string,
那麽预设的 memberwise 指派动作:
newAcct = oldAcct;
就会被编译器唤起,犹如编译器为我们产生了以下的 copy assignment 运算子:

更正:
举个例子,如果我再次修改 Account class 的定义,令 _name 的型别为 string,
那麽当:
newAcct = oldAcct;
预设的 memberwise 指派动作就会被编译器唤起,犹如编译器为我们产生了
以下的 copy assignment 运算子:

■p915, 第二段文字,第一行(译笔不佳,重译)
原文:一个 derived class constructor 只能合法地唤起其
      「直接 base class」的 constructor
更正:一个 derived class constructor 能够合法直接唤起的 construtor 只有其
      「直接 base class」的 constructor

■p915, 17.4.4 的标题(修润)
原文:17.4.4 惰式错误侦测(Lazy Error Detection)
更正:17.4.4 缓式错误侦测(Lazy Error Detection)
注意:请同时修改
      p.ix, 目录
      p.916, L6
      p.981, 18.3.2 标题前两行
      p.984, L-6
      p.1224, 索引

■p941, 17.5.8 标题(误译)
原文:虚拟函式、虚拟解构式 constructor、虚拟解构式 destructor
更正:在建构式(constructors)与解构式(destructors)中呼叫虚拟函式
注意:请同时修改目录 (p.x)

■p1006, L-13(译笔不佳,重译)
原文:一旦成为 base class,class template 必须完整列出其参数列。
修改:欲令一个 class template 扮演 base class 的角色,我们必须完整列出其参数列。

■p1045  19.2.7 标题(笔误)
原文:19.2.7 Constructors(解构式)和 Function try Blocks 的关系
更正:19.2.7 Constructors(建构式)和 Function try Blocks 的关系

■p1126, adjacent_difference 内文第二行(误译)
原文:给予数列 {0,1,1,2,3,5,8},新数列的 first 元素是
      原数列的 first 元素的拷贝:0。
更正:给予数列 {0,1,1,2,3,5,8},新数列的第一个元素是
      原数列的第一个元素的拷贝:0。

■p1126, L-15, p1127, L9(原书错误)
说明:这两行出现的 times,是某 function object 的旧名称,
      在 C++ standard 中已改名为 multiplies. 见 p590
更正:将这两行出现的 times<int> 改为 multiplies<int>

■p1127, adjacent_find() 第二版本规格,最后一行(原书错误)
原文:ForwardIterator last, Predicate pred);
更正:ForwardIterator last, BinaryPredicate pred);

■p1128, binary_search() 第二版本规格,缺一行(原书遗漏)
原文:bool
      binary_search(ForwardIterator first,
                    ForwardIterator last, const Type &value,
                    Compare comp);
更正:请在 bool 前面加上一行
      template <class ForwardIterator, class Type, class Compare>

■p1149, inner_product() 规格说明最后一行(原书错误)
原文:  (2+1) - (3+2) - (5+3) - (8+4)
更正:- (2+1) - (3+2) - (5+3) - (8+4)

■p1166, L9, L20(原书错误)
■p1167, L1, L3 (原书错误)
说明:这四行出现的 times,是某 function object 的旧名称,
      在 C++ standard 中已改名为 multiplies. 见 p590
更正:将这四行出现的 times<int> 改为 multiplies<int>

■p1177, rotate() 规格说明第一行(原书错误)
原文:rotate() 会将 [first,middle) 范围内的元素搬移到 container 尾端。
更正:rotate() 会将 [first,middle) 范围内的元素搬移到 last 所指位置。

■p24: L-13
原文:阵列的名称是 fibon。这是一个整数阵列,维数为 9。
更正:阵列的名称是 fibon。这是一个整数阵列,尺度(元素个数)为 9。

■p24: L-6
原文:最后一个元素,我们应该把维数减 1 做为索引值
更正:最后一个元素,我们应该把尺度(元素个数)减 1 做为索引值

■p28: L-9
原文:new 算式的第二个版本配置出一个特定型别和特定维数的阵列。
更正:new 算式的第二个版本配置出一个特定型别和特定尺度(元素个数)的阵列。

■p34: L7
原文:我把阵列的维数指定给 array_size。
更正:我把阵列的大小指定给 array_size。

■p114: 最后一段文字
原文:
阵列的定义系由型别符号、识别名称、维度(dimension)三者构成。
维度以一个中括号表示,指出阵列之中有多少元素。阵列的维度大小必须
大于或等于 1。维度值必须是一个常数算式,也就是说,它必须能够在
编译时期便被编译器核定(evaluate)其值。换言之一个 non-const
变数不能够用来指定阵列的维度大小。

更正:
阵列的定义系由型别符号、识别名称、尺度(dimension)三者构成。
尺度以一个中括号表示,指出阵列之中有多少元素。阵列的尺度必须
大于或等于 1。尺度必须是一个常数算式,也就是说,它必须能够在
编译时期便被编译器核定(evaluate)其值。换言之一个 non-const
变数不能够用来指定阵列的尺度大小。

■p115: L2
原文:只能够在执行时期完成,所以它不能够用来指定阵列维度。
更正:只能够在执行时期完成,所以它不能够用来指定阵列尺度。

■p115: L-13
原文:面对一个明白初始化的阵列,你不需要再指定其维度,
更正:面对一个明白初始化的阵列,你不需要再指定其尺度,

■p115: L-9
原文:如果维度被明白指出,那麽串列中的元素个数就不能够超越该值,
更正:如果尺度被明白指出,那麽串列中的元素个数就不能够超越该值,

■p116: L1
原文:ca1 的维度值是 3 而 ca2 的维度值是 4。
更正:ca1 的尺度(元素个数)是 3 而 ca2 的尺度是 4。

■p162: L8
原文:像是阵列的维数,或是 template 的 nontype 参数。
更正:像是阵列的尺度(元素个数),或是 template 的 nontype 参数。

■p415: L13
原文:以 new 算式配置获得的阵列,其维度可被指定为┅
更正:以 new 算式配置获得的阵列,其尺度(元素个数)可被指定为┅

■p616: L6
原文:也应该允许使用者在执行时期设定萤幕的实际维度。
更正:也应该允许使用者在执行时期设定萤幕的实际尺寸。

■p617: L-14
原文:使用者决定让所有的 Screen class objects 维度为 80 x 24,
更正:使用者决定让所有的 Screen class objects 尺寸为 80 x 24,

■p1079: L17
原文:其中的 bufSize 便是字元阵列 buf 的维度。
更正:其中的 bufSize 便是字元阵列 buf 的尺度(元素个数)。

■p1079: L22
原文:如果 buf 的宣告并未指定维度:
更正:如果 buf 的宣告并未指定尺度(元素个数):

■导读 p23, L-6
原文:以下造成上述 function template 产生出
      函式实体 func(float, float, int);
更正:以下造成上述 function template 产生出
      函式实体 double func(double, double, int);

■前言p.xviii, L9(误译)
原文:最后我要说,当一个人写了一本书,他决定略去的东西,
      往往和他决定涵盖的东西一样重要。
更正:最后我要说,当一个人写了一本书,他决定略去什麽东西,
      往往和他决定涵盖什麽东西一样重要。

■p35 L13(原书笔误)
原文:#include <string>;
更正:#include <string>
感谢:alberta

■p39 L2(原书笔误)
原文:{init(rhs.size, rhs.ia);}
更正:{init(rhs._size,rhs.ia);}
感谢:chlin, Aua

■p39 L-3(原书笔误)
原文:assert( index >= 0 && index < size );
更正:assert( index >= 0 && index < _size );

■p108, L10
原文:
如果由右往左阅读上述定义,我们会发现,pi_ref 是个 reference,
代表一个指标,此指标指向一个型别为 int 的 const object。
但是我们的 reference 实际上却未被用来代表一个常数,而是被用来
代表一个非常数指标(该指标指向一个常数 object)。

更正:
如果由右往左阅读上述定义,我们会发现,pi_ref 是个 reference,
代表一个指标,此指标指向一个型别为 int 的 const object。
我们的 reference 代表的不是一个常数指标,而是一个非常数指标,
指向一个常数 object。

■p125 练习 3.25(原书笔误)
原文:bool is_equal( const int*ia)
更正:bool is_equal( const int* ia)    请在 ia 之前加一空格
感谢:黄向阳先生

■p125 页眉位置
说明:页眉位置跑掉了

■p155 L6(原书错误)
原文:while( ix_vec < 10 )
更正:while( ix_vec < 9 )

■p183 L3(错别字)
原文:就某种意义而言,这说明了 C++ 语言一个自相矛顿的基础议题。
更正:就某种意义而言,这说明了 C++ 语言一个自相矛盾的基础议题。

■p183 L7(错别字)
原文:Standard C++ 引入这些转型运算子以强调(鲜明标示出)这个矛顿
更正:Standard C++ 引入这些转型运算子以强调(鲜明标示出)这个矛盾

■p209 练习5.7 (d) 第一行(原书笔误)
原文:int ival=512 jval=1024, kval=4096;
更正:int ival=512, jval=1024, kval=4096; (原行少一个逗号)

■p230 L11(原书笔误)
原文:class ilist_item {
更正:class ilist {

■p242 L-4(笔误)
原文:...,後面紧跟着一串以中括号为界的参数。
更正:...,後面紧跟着一串以角括号为界的参数。

■p468, 第二大段程式码的第五行(注解)出现一个中文乱码
原文:potentially dangerous depending on i掇 value
更正:potentially dangerous depending on i's value

■p504, L-1
原文:根据各对应之「函式引数」所推导出来的「template 引数」,结果一定相同。
更正:根据各对应之「函式引数」所推导出来的「template 引数」,结果必须相同。

■p592, L16(原书笔误)
原文:Ires = IntNot( Ival1, Ival2 );
更正:Ires = IntNot( Ival1 );
说明:logical_not 是一个 unary function object

■p599, L4(中译本笔误)
原文:其中必须定义有一个 input 运算子(operator<<)
更正:其中必须定义有一个 input 运算子(operator>>)

■p600, L5(原书笔误)
原文:其中必须定义有一个 output 运算子(operator>>)
更正:其中必须定义有一个 output 运算子(operator<<)

■p694, L6(原书笔误)
原文:Account *pacct;
更正:Account *pact;

■p694, L9(原书笔误)
原文:pact->Acct.Account::Account(
更正:pact->Account::Account(

■p709, 练习14.8, L4(原书笔误)
原文:Accout acct;
更正:Account acct;

■p1183, L6(译笔重修)
原文:传回值 OutputIerator 指向被放进 result 所指之 container 内的
      最后元素的下一位置。
更正:传回值 OutputIerator 指向「result 所指之 container」内的
      最后元素的下一位置。

■p1188, 小标题 swap_range()(原书错误)
原文:swap_range()
更正:swap_ranges()
注意:该小段的函式原型、文字第一行、文字第四行各有一个 swap_range(),
      皆应改为 swap_ranges()。同时请修改 p.xii 之目录及 p.1235 之索引。

■p729, L12 (误译)
原文:会将 newAcct 的每一个 nonstatic member 一一指派给 oldAcct 的对应 member。
更正:会将 oldAcct 的每一个 nonstatic member 一一指派给 newAcct 的对应 member。

■p826, L9  (原书笔误)
原文:template <int size> Buf { ... };
更正:template <int size> class Buf { ... };

■p903, L9  (笔误)
原文:...必须统统出现于相同的 socpe 内。
更正:...必须统统出现于相同的 scope 内。

■p239 L-1(原书笔误)
原文:init_iter( ilist_item *it = 0 );
更正:ilist_item* init_iter( ilist_item *it = 0 );

■p1228, 索引右栏 L-10(笔误)
原文:increment(++) 递减
更正:increment(++) 递增

■p1119, 表20-1 第一行 (笔误)
原文:Boolalpha
更正:boolalpha

■p91 L-1(原书笔误)
原文:因此 ip+2 是否导致一个合法...
更正:因此 pi+2 是否导致一个合法...

■p780 15.9.2 节,L1(重译)
原文:Class constructor 之中凡使用单一参数者,例如...
更正:Class constructor 之中凡能接受单一引数者,例如...

■p731 L-11(误植1+错字1)
原文:一般而言,copy constructor 运算子和 copy assignment 运算子
      应该被视为栾生兄弟。
更正:一般而言,copy constructor 和 copy assignment 运算子
      应该被视为孪生兄弟。

■p991 程式码最后,class MI (原书遗漏)
原文:class MI : public Derived, public Base2 {
      public:
      // ...
更正:class MI : public Derived, public Base2 {
      public:
      void foo(double);     // 注意,新增此行
      // ...

■4.13 标题
原文:4.13 优先权(Precedence)
更正:4.13 优先序(Precedence)
注:1. precedence 译为优先序,比较不会和 priority(优先权)混淆。
    2. 请检修整个 4.13 节,并修改目录 4.13 及索引 p1228。

■导读 p22, L9 (笔误)
原文:小括弧内称为函式本体(function body)
更正:大括弧内称为函式本体(function body)

■导读 p23, L21(误植)
原文:// 使用者自定的转换为行系由┅
更正:// 使用者自定的转换行为系由┅

■导读 p29, L-2 (笔误)
原文:┅而不是针对所有的 tempalte 参数做特殊化┅
更正:┅而不是针对所有的 template 参数做特殊化┅

■p46, L-10(误译)
原文:并被含入于 IntArray.h 表头档中
更正:并含入 IntArray.h 表头档
■p77, L-13(原书错误)
原文:/14(new line)
更正:/12(new line)

■p78, L-2(原书题目设计错误)
原文:(b) 10, 10u, 10L, 10uL, 012, 0xC
更正:(b) 10, 10u,
 10L, 10uL, 012, 0xA

■p355, 练习 7.6 (b)(原书笔误)
原文:operator( matrix );
修改:operate( matrix );

■p538, L1(制版遗漏)
原文:    max( &ad[0], size );
修改:    max( &ad[0], size );
      }   // 书上少印了这个右大括弧


■p803, L7(误译)
原文:宣告于某 namespace 内的「运算子 集」-- 该 namespace 定义有
      该型别之运算子
修改:宣告于某 namespace 内的「运算子 集」-- 该 namespace 定义有
      被使用之运算元型别

■p1072, 练习 20.1 题目最后一行码(原书笔误)
原文:complex purei( 0, 7 )
修改:complex<double> purei( 0, 7 )
■p1143, find_end 文字说明第二行起(补强)
原文:例如,给予字元序列 Mississippi 和第二序列 ss,
      find_end() 会传
回一个 ForwardIterator 指向
      第二个 ss 的第一个 s 的位置。
修改:例如,给予字元序列 Mississippi 和第二序列 ss,
      find_end() 会传回一个 ForwardIterator 指向
      Mississippi 中的第二个 ss 的第一个 s 的位置。

■p239, L3(原书错误)
原文: : _at_front(0), _at_end(0)
修改: : _at_front(0), _at_end(0), _size(0)
说明:如果没有这麽做,copy 之後,新的 list 的元素个数会出错

■p269, L6 (中译本笔误)
原文:一个以的元素呢?
修改:一个以上的元素呢?


■p288, L-3 (中译本笔误)
原文:size_type endPos = name.find_last_off( 'a' );
更正:size_type endPos = name.find_last_of( 'a' );

■p659, L20 (中译本笔误)
原文:最大的资料型别是 dval,
更正:最大的资料型别是 _dval,


■p119, L-12(误译)
原文:上述对 ia 所作的提领 (deferencing) 动作,会传回阵列中
      第一个元素的位址;然後再加上 1。
更正:上述对 ia 所作的提领 (deferencing) 动作,会传回阵列中
      第一个元素的值;然後再加上 1。

■p710, L-6(原书笔误)
原文:pooh_pals[1]._name != pooh_pals[2]._name();
更正:pooh_pals[1]._name != pooh_pals[2]._name;

■p1125, L14 (原书错误)
说明:这里出现的 times,是某 function object 的旧名称,
      在 C++ standard 中已改名为 multiplies. 见 p590
更正:将 times<int> 改为 multiplies<int>


■pix & p825, 16.2.1 标题(误译)
原文:为非型别参数(Nontype Parameters)指定 Template 引数
更正:为 Template 的非型别参数(Nontype Parameters)指定引数

■p522, 上半部程式码之下的第一段文字的第二行最后(原书错误)
原文:Type 的 template 引数因而是 int 而非 int*。
更正:template 引数 Type 因而是 int* 而非 int。
感谢:jjhou
日期:2001/03/29

■p522, 上半部程式码之下的第二段文字的第二行最后(中译本错误)
原文:例如稍早的 T* 和 T,template A(特制体)必须有个参数能够接受
      「template B 之对应参数」所能接受的引数的超集。
更正:例如稍早的 T* 和 T,template B 必须有个参数,能够接受
      「template A(特制体)之对应参数」所能接受的引数的超集。

■p692, L-3(误译)
原文:即使有这样的需求,C++ class 规格也不允许这麽做。要知道,我们的...
更正:啊呀,class Account 的规格并不允许这麽做(译注:意指不允许「只指定
      帐户馀额却不指定帐户名称」)。因此,我们的...

原文:const int *&pi_ref = &ival;
更正:const int *const &pi_ref = &ival;
日期:2001/07/23
侯捷注:经网友提醒,以上错误发生于 L15,而非 L9。因此,
        请将 L9 改回原状:const int *&pi_ref = &ival;
        并将 L15 由书上的 int *const &pi_ref = &ival;
        改为:      const int *const &pi_ref = &ival;

■p131, L-8(英文版勘误)
原文:paramenter_list
更正:parameter_list


■p137, L13(英文版勘误)
原文:operator<<( ostream& os, const String &s )
更正:operator<<( ostream& os, String &s )


■p158, L11(英文版勘误)
原文:cout << cval << 'endl';
更正:cout << cval << endl;


■p170, L-11(英文版勘误)
原文:// equivalent initialiation as bitvec3
更正:// equivalent initialization as bitvec3


■p186, L2~L6(英文版勘误)
原文:

如果 _top 等于 0,empty() 传回 true;如果 _top 等于 _stack.size()-1,
full() 传回 true(上述 -1 是因为 vector 的元素编号和阵列一样,都是
从 0 开始起算)
inline bool iStack::empty() { return _top ? false : true; }
inline bool iStack::full()  {
               return _top < _stack.size()-1 ? false : true;

更正:

如果 _top 等于 0,empty() 传回 true;如果 _top 等于 _stack.size(),
full() 传回 true:
inline bool iStack::empty() { return _top ? false : true; }
inline bool iStack::full()  {
               return _top < _stack.size() ? false : true;


■p266, L12(英文版勘误)
原文:
if ( *c_iter % 2 )
     pvec_even->push_back( *c_iter );
else pvec_odd->push_back( *c_iter );
更正:
if ( *c_iter % 2 )
     pvec_odd->push_back( *c_iter );
else pvec_even->push_back( *c_iter );


■p266, L19(英文版勘误)
原文:vec->begin()+vec.size()/2;
更正:vec.begin()+vec.size()/2;


■p271, L15(英文版勘误)
原文:for ( ; iter != buffer.end(); iter++ );
更正:for ( ; iter != buffer.end(); ++iter );

■p271, 6.6.2 节以下,至本页尾(英文版勘误)
原文:文中多处使用 svec1 和 svec2
更正:请全部改为 slist1 和 slist2,以便与下一页配合

■p282, L-11(英文版勘误)
原文:string sentence = line1 + line2 + line3;
更正:string sentence = line1 + ' ' + line2 + ' ' + line3;
注意:拥有本书题解者,请一并修正。

■p289, L1(英文版勘误)
原文:

注意,第二个 iterator 所指的字元并不涵盖于删除范围之内。
erase() 的第三型式需要一个 iterator 做为引数,此 iterator 标示出一个
起始位置,从该位置之後直到字串结束为止的所有字元都会被移除。例如:
name.erase( name.begin() + 4 );
会使 name 变成 "Anna"。

更正:

注意,第二个 iterator 所指的字元并不涵盖于删除范围之内。这意味我们
产生出来的是 Annaabelle 而不是 Annabelle。于是,我使用 erase() 的
第三型式,以一个 iterator 做为引数,标示出欲移除的字元位置。
我把 endPos 当做引数,用以删除多馀的第二个 'a':
name.erase( endPos );
现在我们的 name 变成了 "Annabelle"。

日期:2001/07/23

补充:jau_lueng su 指出,以上更正後的叙述有误。
检讨:的确,lippman 在此处挖东补西,写得不好。
重新更正:
  注意,第二个 iterator 所指的字元并不涵盖于删除范围之内。这意味我们
  产生出来的是 Annaabelle 而不是 Annabelle。于是,我使用 erase() 的
  第三型式,以一个 iterator 做为引数,标示出欲移除的字元位置。
  name.erase( name.begin() + 4 );
  现在我们的 name 变成了 "Annabelle"。

■p289, L12(英文版勘误)
原文:string_object.insert( pos+1, 's' );
更正:string_object.insert( pos+1, "s" );


■p289, L-13(英文版勘误)
原文:posEnd // end position within new_string
更正:posEnd // number of characters to copy

■p289, L-1(英文版勘误)
原文:s3.assign( s1, 4 );
更正:s3.assign( s1, 0, 4 );

■p290, L6(英文版勘误)
原文:s3.append( s2, 4 );
更正:s3.append( s2, 0, 4 );

■p290, L8(英文版勘误)
原文:s3.assign( s1, 4 ).append( ' ' ).append( s2, 4 );
更正:s3.assign( s1, 0, 4 ).append( ' ' ).append( s2, 0, 4 );
补充:jau_lueng su 指出,append() 只能接受字串而非字元,上式应改为:
更正:s3.assign( s1, 0, 4 ).append( " " ).append( s2, 0, 4 );

■p293, L18(英文版勘误)
原文:hmm.replace( position, 4, 'x', 4 );
更正:hmm.replace( position, 4, 4, 'x' );
■p325, L-1(英文版勘误)
原文:inline bool iStack::size() { return _stack.size(); }
更正:inline int  iStack::size() { return _stack.size(); }

■p456, L-6(英文版勘误)
原文:void main() {
更正:int  main() {
■p463, L-4(英文版勘误)
原文:void func( int *parm ) {
更正:int  func( int *parm ) {

■p467, L9, L10(英文版勘误)
原文:format( a1 );  // calls format( int )  译注:a1 请见上一页
      format( a2 );  // calls format( unsigned int )  译注:a2 请见上一页
更正:format( e1 );  // calls format( int )  译注:e1 请见上一页
      format( e2 );  // calls format( unsigned int )  译注:e2 请见上一页

■p470, L-10(英文版勘误)
原文:void func( int *pi, string *ps ) {
更正:int  func( int *pi, string *ps ) {
■p472, L4(英文版勘误)
原文:void manip( int i1, int i2 ) {
更正:int  manip( int i1, int i2 ) {

■p605, L13(英文版勘误)
原文:remove_if_copy()
更正:remove_copy_if()


■p616, L17(英文版勘误)
原文:void checkRange( int, int );
更正:bool checkRange( int, int );


■p870, L-6(英文版勘误)
原文:for ( ; ix < _size  ++ix )
更正:for ( ; ix < _size; ++ix )


■p1049, L-7(英文版勘误)
原文:range_error exception
更正:out_of_range exception


■p1102, L16(英文版勘误)
原文:函式名称中的 g 表示重新指位动作是为了取得(getting)字元
      (用于 ofstream class object),p 则表示重新指位动作是为了放置
      (putting)字元(用于 ifstream class object)。
更正:函式名称中的 g 表示重新指位动作是为了取得(getting)字元
      (用于 ifstream class object),p 则表示重新指位动作是为了放置
      (putting)字元(用于 ofstream class object)。


■p1087, L-8(英文版错误)
原文:const lineSize = 1024;
更正:const int lineSize = 1024;


■p200, L19(中译本处理错误)
原文:for ( int ix = 0; ix < size; ++ix )
原文:for ( int ix = 1; ix < size; ++ix )


■p239, L3(原书错误)
原文: : _at_front(0), _at_end(0)
修改: : _at_front(0), _at_end(0), _size(0)
说明:如果没有这麽做,copy 之後,新的 list 的元素个数会出错


■p1000,L13(漏印)
原文:: ZooAnimal( name, onExhibit, "Bear" )
更正:: ZooAnimal( name, onExhibit, "Bear" ),
提示:最后加一个逗点


■p1000,L-7(英文版笔误)
原文:Endangered::critical )
更正:Endangered::critical ),


 

C++Primer读书笔记C++概述.pdf C++Primer中文第三版(C++从入门到精通)第一章的读书笔记,主要是C++程序、预处理器指示符、iostream库等的基础知识点读书笔记 立即下载

相关推荐

C++ Primer 中文版》笔记(持续更新)

第Ⅰ部分 C++基础 第2章 变量和基本类型 2.1 未定义的(undefined) 变量的值出现 未定义的(undefined) 情况 a. 变量被赋予超出其表示范围的值时 b. 函数体内部的内置类型变量未被初始化时 未定义的后果: 程序可能继续工作、可能崩溃,也可能生成垃圾数据。1 如何避免 a. 所有变量均初始化 b. 注意变量所能表示的范围 2.2 默认初始化 内置类型 a. 函数体外的内置类型变量默认值为0 b. 函数体内的内置类型变量必须初始化,否则其值即未定义的

m0_52072800的博客 306

c++ primer 的学习心得

          学习《c++  primer 3rd 中文版》有一个多月了,没有按顺序看,因为以前看过 钱能的 那本 《c++程序设计》,就从网上下了电子版的看,pdf的,可以在上面直接做笔记,有些章节打印出来看,同时参考了《c++ 编程金典》。本来是打算看 《thinking in  c++ 》的,看到第三章,就看不懂了,干脆就,找了本 据说是基础的经典的书籍 《c++  primer 3r

c++ primer的专栏 1890

C++ Primer》阅读感想

无疑的,《C++ Primer》是一本相当好的书,里面的内容相当丰富。 然而,或许是它太过于丰富了,作为primer,我始终认为它有所欠缺。 欠缺的,不是它的内容,而是它的知识框架。 我心中理想的C++指导书的样子,可以根据《C++ Primer》拆分成两本。 第一本,基础篇。 一、从类型、变量、表达式,到语句、函数。介绍这些语言的基本。 二、从类到封装、继承、多态。介绍其基本

Van0512的博客 1760

C++ Primer》读后感

开学后因为干项目的原因,读书的计划几乎被搁浅了

1533

C++primer读书笔记

4.1.有效下标值的重要性 编译器不会检查使用的下标是否有效,程序运行后可能出现问题。 4.2.数组的初始化 如果只对部分初始化,前面的赋值后,后面的部分自动赋值为0. 如果需要全部设置为0,则可以直接在第一个元素处写为0. 例:float a = {0} 4.3.字符串 空字符\0的ASCII码值为0 如果是字符数组,则应该按照字符处理,如果是字符串数组,带有空字符的,则按照字符...

yuanxun4683的博客 600

C++ Primer 中文版》第4版 读书笔记

C++ Primer 中文版》第4版 读书笔记作者:    Stanley B.Lippman                  Josee Lajoie                BarBara E.Moo翻译:    李师贤 蒋爱军 梅晓勇 林瑛出版:    人民邮电出版社 2006.3书号:    ISBN 7-115-14554-7                T

ﺴ۩๑一棵树的程序历程๑۩ﺴ 1891

C++ Primer 中文版 第5版 读书笔记

分离式编译如果想声明一个变量而非定义它,就在变量前添加关键字extern// 声明i,而非定义iint j;// 声明并定义j任何包含了显示初始化的声明即成为定义。我们能给由extern关键字标记的变量赋一个初始值,但是这么做也就抵消了extern的作用。extern// 定义变量能且只能被定义一次,但是可以多次声明标准库类型string表示可变长的字符序列// 列表初始化// 错误注意字符串字面值的结尾处还有一个空字符如前所述,switch的执行流程有可能会跨过某些case标签。

weixin_44623642的博客 1835

C++ Primer 中文版》第七 章读书笔记及习题解答

目录类简介7.1 定义抽象数据类型7.2 访问控制与封装7.3 类的其他特性7.4 类的作用域7.5 构造函数再探7.6 类的静态成员小结习题解答 类 简介   在C++语言中,我们使用类定义自己的数据类型。通过定义新的数据类型来反映待解决问题中的各种概念,可以使我们更容易编写、调试和修改程序。   本章是第二章关于类的话题的延续,主要关注数据抽象的重要性。数据抽象能帮助我们将对象的具体实现与对象所能执行的操作分离开来。我们将在第13章讨论如何控制对象拷贝、移动、赋值和销毁等行为,在第14章中我们将学习如何

qq_44732492的博客 772

读书笔记C++ Primer中文版

四年前读了第三版,感觉收获颇丰。今次再读第四版,摘录一些知识点。 第一章:Windows命令行下编译:cl -GX propName.cpp运行后查看main函数返回值: echo %ERRORLEVEL%第二章:1.长字符串分行方式:(例子) char str1[] = "Test string ""a line stringssdv"; char str2[] = "Tes

我的博客 882

读书笔记:C++ primer plus 第六版 中文版】第3章:数据处理

转载请注明出处: 本章内容包括: C++变量的命名规则. C++内置的整型 unsigned long,long,unsigned int,int,unsigned short,short,char,unsigned char,signed char和bool. C++11新增的整型:unsigned long long和long long. 表示各种整型的系统限制的climits文件. 各种整型的

enyusmile 1211

C++ Primer 中文版》第四 章读书笔记及习题解答

目录第四章 表达式简介4.1 基础4.11 基本概念4.2 算术运算符。4.3 逻辑和关系运算符4.4 赋值运算符4.5 递增和递减运算符4.6 成员访问运算符4.7 条件运算符4.8 位运算符4.9 sizeof运算符4.10 逗号运算符4.11 类型转换4.12 运算符优先级表小结 第四章 表达式 简介   C++语言提供了一套丰富的运算符,并定义了这些运算符作用于内置类型的运算对象时所执行的操作。同时,当运算对象是类类型时,C++语言也允许由用户指定上述运算符的含义。本章主要介绍由语言本身定义、并用于

qq_44732492的博客 1301

C++ Primer 中文版》第八 章读书笔记及习题解答

目录IO库简介8.1 IO类8.2 文件输入输出8.3 string流小结习题解答 IO库 简介   C++语言不直接处理输入输出,而是通过一族定义在标准库的类型来处理IO。这些类型支持从设备读取数据,向设备写入数据的IO操作,设备可以是文件、控制台窗等。还有一些类型运行内存IO,即从string读取数据,向string写入数据。   IO库定义了读写内置类型值的操作。此外,一些类,如string,通常也会定义类似的IO操作,来读写自己的对象。   本章介绍IO库的基本内容。后续章节会介绍更多IO库的功能:

qq_44732492的博客 818

读书笔记:C++ primer plus 第六版 中文版】第1章 预备知识

本章内容包括: C语言和C++的发展历史和基本原理. 过程性编程和面向对象编程. C++是如何在C语言的基础上添加面向对象概念的. C++是如何在C语言的基础上添加泛型编程概念的. 编程语言标准. 创建程序的技巧. 1.1 C++简介 C++融合了3种不同的编程方式:C语言代表的过程型语言,C++在C语言基础上添加的类代表的面向对象语言,C++模板支持的泛型编程. 1.2 C++简史 1.2.1

enyusmile 1278

C++ Primer 中文版》第六 章读书笔记及习题解答

目录函数简介6.1 函数基础6.2 参数传递6.3 返回类型和return语句6.4 函数重载6.5 特殊用途语言特性6.6 函数匹配6.7 函数指针小结习题解答 函数 简介 6.1 函数基础 6.2 参数传递 6.3 返回类型和return语句 6.4 函数重载 6.5 特殊用途语言特性 6.6 函数匹配 6.7 函数指针 小结 习题解答 ...

qq_44732492的博客 1186

C++ Primer 中文版》第五 章读书笔记及习题解答

目录5.1 简单语句5.2 语句作用域5.3 条件语句5.4 迭代语句5.5 跳转语句5.6 try语句和异常处理小结习题解答 5.1 简单语句 5.2 语句作用域 5.3 条件语句 5.4 迭代语句 5.5 跳转语句 5.6 try语句和异常处理 小结 习题解答 ...

qq_44732492的博客 299

C++ Primer 中文版》第三 章读书笔记及习题解答

第三章 字符串、向量和数组 简介   除了第二章介绍的内置类型以外,C++语言还定义一个内容丰富的抽象数据类型库。其中,string和vector是两种最重要的标准库类型,前者支持可变长字符串,后者则表示可变长的集合。还有一种标准库类型是迭代器,它是string和vector的配套类型,常被用于访问string中的字符和vector中的元素。内置数组则是更基础的类型,string和vect都是对它的某种抽象。第二章介绍的内置类型是由C++语言直接定义的。这些类型,比如数字和字符,体现了大多数计算机硬件本身具

qq_44732492的博客 676
上一篇: Rational ClearCase 权限要求的Tirgger
下一篇: Hibernate性能调优
jaminwm
jaminwm 领域专家: 数据库技术领域 领域专家: 数据库技术领域
博客等级 码龄24年 1393粉丝 514原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值