Accelerated C++笔记

Accelerated C++笔记

第0章

  1. cout:标准输出流 cin:标准输入流
  2. namespace(名字空间):其实就是为了方便重复使用变量名,给变量名设置的前缀
  3. 标准库由很多个部分组成,如:iostream、string。标准库的名字空间即为std(standard)

第1章

  1. <<和>>都是左结合
  2. 初始化一个变量时,变量名后面跟着一对“()”,“()”中包含若干个表达式。这种初始化方式实际上相当于调用了构造方法,然后再给变量赋值。例如:std::string spaces(10, ‘*’),这里相当于调用了string的构造器,传入两个参数,生成对象,然后赋值给spaces。另外string的这个构造方法中的第二个参数只能是字符,而不可以是字符串
  3. 假设is是输入流,s是字符串,is>>s,从is中读取到的字符会覆盖s中已有的字符
  4. std::cin >> v表达式会忽略标准输入流最开始的空白字符
  5. std::cin >> v 返回cin,std::cout << v 返回cout

第2章

  1. std::string::size_type size; 这里声明了一个名为size的变量,该变量的类型为std::string::size_type,这里std相当于Java的包名,string相当于Java的类名,size_type相当于Java的内部类(可以理解为size_type的外部类为string)。之所以用size_type定义size,而不使用int或long,是因为int或long的可存储的长度是有限的。size_type是C++为string定义的可以存储任意字符串长度的类。如果我们想保存特定数据结构的大小,就应该使用库为其准备的类型。
  2. 如果一个using出现在花括号中,那么它定义的名称的作用域会从定义的地方开始,到对应的结束花括号处结束。
  3. 算数值可以被转换成布尔值:0值可以被看成是false,其它值可以被看成是true

第3章

  1. 如果两个以上的字符串直接量仅仅是被空白符分割开的话,那么这些字符串直接量会被自动连接在一起。如下:
    cout << "A""B" 等价于 cout << "AB"
  2. 内部类型的局部变量如果没有被明确初始化的话,那么C++系统就会为它赋值一个随机值
  3. 头文件<ios>定义了一个类型streamsize,输入/输出库用这个类型表示精度(即有效位数)
  4. 通过使用setprecision,我们可以改变出现在cout中所有后继输出的精度
  5. 下面两段代码是等价的:
streamsize prec = cout.precision();
cout << setprecision(3) << 3.1415926 << setprecision(prec) << endl;
//设置精度为3,并返回原先的精度
streamsize prec = cout.precision(3);
cout << 3.1415926 << endl;
cout.precision(prec);

以下这两段代码也是等价的:

if(cin >> x){/** ...**/}
cin >> x;
if(cin){/**...**/}

用cin作为条件等价于检测最近的一次从cin读取数据是否成功。
在以下情况中,我们从流读取数据会以失败告终:

  • 已经到了输入文件的结尾
  • 我们碰到的输入与我们试图读取变量类型不一致;例如:我们想读一个整数,但是实际读取到的却不是一个整数
  • 在输入装置中检测到一个硬件问题

一旦我们不能从流中成功读到数据,那么接下来所有从流中读数据的尝试都会以失败告终,除非我们重置了流。
6. 以下代码运行时,若输入连续的回车键,并不会跳出循环,因为这些回车键被视为输入最开始时的空白字符而被忽略掉。

while(cin >> x){
    ...
}
  1. typedef可以为指定类型设置一个代替名,例如:
vector<double> test;
typedef vector<double>::size_type vec_sz;
vec_sz size = test.size();

上述代码中vec_sz就相当于vector<double>::size_type。所以与下面的代码是等价的:

vector<double> test;
vector<double>::size_type size = test.size();

其中size_type是用来表示vector的元素个数的类型。
8. sort函数定义在头文件<algorithm>中,它把容器中的数据重新排序成非递减序列。
9.

#include <vector>
int main(){
    vector<double> test;
    test.push_back(3.1415926);
    test.begin();//返回一个数值,这个数值指示了vector的第一个元素
    test.end();//返回一个数值,这个数值指示了紧跟在vector的最后一个元素之后的位置
}

10.所有标准库的长度类型都是无符号整数类型。当普通整数与无符号整数在表达式中结合在一起时,普通整数就会被转换成无符号整数。因此,诸如vector.size()-100这样的表达式将产生无符号的结果,这也意味着结果不可能小于0——即使vector.size()<100。

第4章

  1. 以下代码是不合法的:

    const vector<double>& vec1;
    vector<double>& vec2 = vec1;

    因为之前我们已经保证了不会去改变vec1的值,vec2 = vec1相当于向vec1请求写访问。
  2. 如果某个函数的参数类型为const vector<double>&,那么该参数既可以接受常量也可以接受变量。
  3. 头文件<stdexcept>中定义的异常domain_error相当于“非法参数异常”。
  4. C++的函数不允许返回局部变量的地址和引用。
  5. 关于引用:
    引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。

    C++的引用VS指针

    • 不存在空引用。引用必须连接到一块合法的内存。
    • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
    • 引用必须在创建时被初始化。指针可以在任何时间被初始化。

    其中“引用是某个已存在变量的另一个名字”,规定了下面代码不合法:

    void bar(string & s);
    bar("hello world");//这里的“hello world”是字符串常量,不是某个变量,所以这样传参,参数s无法成为某个变量的别名

    “不存在空引用”规定了下面代码不合法:

    string foo( );
    void bar(string & s);
    bar(foo( ));//C++中函数的返回值是一个临时变量,这个临时变量会在函数执行结束后被销毁。这样传参,参数s即为函数foo返回的临时变量的别名,但是临时变量下个瞬间就会被销毁,导致s成为了“无所指”的引用。

    如果改成这样就合法了:

    string foo( );
    void bar(string & s);
    string r = foo();//将函数foo返回的临时变量赋值给一个新的变量
    bar(r);
  6. setw可以设置下一个输出项的字符长度,当实际输出的字符数不满足该长度时,就往输出项前补空格来完成。

  7. 7.
Accelerated C++源代码 本书全面介绍了C++语言。作为一本入门书(Primer),它以教程的形式对C++语言进行清晰的讲解,并辅以丰富的示例和各种学习辅助手段。与大多数入门教程不同,本书对C++语言本身进行了详尽的描述,并特别着重介绍了目前通行的、行之有效的程序设计技巧。   无数程序员曾使用本书的前几个版本学习C++,在此期间C++也逐渐发展成熟。这些年来,C++语言的发展方向以及C++程序员的关注点,已经从以往注重运行时的效率,转到千方百计地提高程序员的编程效率上。随着标准库的广泛可用,我们现在能够比以往任何时候更高效地学习和使用C++。本书这一版本充分体现了这一点。第4版的改动为了体现现代C++编程风格,我们重新组织并重写了本书。书中不再强调低层编程技术,而把中心转向标准库的使用。书中很早就开始介绍标准库,示例也已经重新改写,充分利用了标准库设施。我们也对语言主题叙述的先后次序进行了重新编排,使讲解更加流畅。除重新组织内容外,为了便于读者理解,我们还增加了几个新的环节。每一章都新增了“小结”和“术语”,概括本章要点。读者可以利用这些部分进行自我检查;如果发现还有不理解的概念,可以重新学习该章中的相关部分。书中还加入了下述几种学习辅助手段:重要术语用黑体表示,我们认为读者已经熟悉的重要术语则用楷体表示。这些术语都会出现在章后的“术语”部分。书中用特殊版式突出标注的文字,是为了向读者提醒语言的重要特征,警示常见的错误,标明良好的编程实践,列出通用的使用技巧。希望这些标注可以帮助读者更快地消化重要概念,避免犯常见错误。为了更易于理解各种特征或概念间的关系,书中大量使用了前后交叉引用。.. 对于某些重要概念和C++新手最头疼的问题,我们进行了额外的讨论和解释。这部分也以特殊版式标出。学习任何程序设计语言都需要编写程序。因此,本书提供了大量的示例。所有示例的源代码可从下列网址获得: http://www.awprofessional.com/cpp_primer 万变不离其宗,本书保持了前几版的特色,仍然是一部全面介绍C++的教程。我们的目标是提供一本清晰、全面、准确的指南性读物。我们通过讲解一系列示例来教授C++语言,示例除了解释语言特征外,还展示了如何善用这门语言。虽然读者不需要事先学过C语言(C++最初的基础)的知识,但我们假定读者已经掌握了一种现代结构化语言。本书结构本书介绍了C++国际标准,既涵盖语言的特征,又讲述了也是标准组成部分的丰富标准库。C++的强大很大程度上来自它支持抽象程序设计。要学会用C++高效地编程,只是掌握句法和语义是远远不够的。我们的重点,在于教会读者怎样利用C++的特性,快速地写出安全的而且性能可与C语言低层程序相媲美的程序。 C++是一种大型的编程语言,这可能会吓倒一些新手。现代C++可以看成由以下三部分组成: l 低级语言,多半继承自C。 l 更高级的语言特征,用户可以借此定义自己的数据类型,组织大规模的程序和系统。 l 标准库,使用上述高级特征提供一整套有用的数据结构和算法。多数C++教材按照下面的顺序展开:先讲低级细节,再介绍更高级的语言特征;在讲完整个语言后才开始解释标准库。结果往往使读者纠缠于低级的程序设计问题和复杂类型定义的编写等细节,而不能真正领会抽象编程的力量。就更不用说学到足够的知识去创建自己的抽象了。本版中我们独辟蹊径。一开始就讲述语言的基础知识和标准库,这样读者就可以写出比较大的有实际意义的程序来。透彻阐释了使用标准库(并且用标准库编写了各种抽象程序)的基础知识之后,我们才进入下一步,学习用C++的其他高级特征,来编写自己的抽象。第一和第二部分讨论语言的基础知识和标准库设施。其重点在于学会如何编写C++程序,如何使用标准库提供的抽象设施。大部分C++程序员需要了解本书这两部分的内容。除了讲解基础知识以外,这两部分还有另外一个重要的意图。标准库设施本身是用C++编写的抽象数据类型,定义标准库所使用的是任何C++程序员都能使用的构造类的语言特征。我们教授C++的经验说明,一开始就使用设计良好的抽象类型,读者会更容易理解如何建立自己的类型。第三到第五部分着重讨论如何编写自己的类型。第三部分介绍C++的核心,即对类的支持。类机制提供了编写自定义抽象的基础。类也是第四部分中所讨论的面向对象编程和泛型编程的基础。全书正文的最后是第五部分,我们在这一部分讨论了一些高级特征,它们在构建大型复杂系统时最为常用。致谢与前几版一样,我们要感谢Bjarne Stroustrup,他不知疲倦地从事着C++方面的工作,他与我们的深厚友情由来已久。我们还要感谢Alex Stepanov,正是他最初凭借敏锐的洞察力创造了容器和算法的概念,这些概念最终形成了标准库的核心。此外,我们要感谢C++
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值