《Essential C++》读书笔记(一)

来源:互联网 发布:数据库防护方案 编辑:程序博客网 时间:2024/05/01 08:00

这一系列的文章是我读《Essential C++》时做的笔记,现在打算复习一遍,便将其打出来,与大家分享下我读这本书的感想和所获得的知识。这本书只是让读者了解下C++,而不是深入的学习,所以全书包括答案和附录索引也仅仅282页,相比于作者的《c++ primer》,这可是少之又少了。不过书中还是会有些知识引人深思,书中的例子也是很好的,但对于许多知识,作者是能省则省了。恩,本来我打算补充来着,把一些基本知识都写出来。不过发现自己不是那块料,瞻前顾后,不知到底怎样组织,所以还是按着笔记写吧。本人就是个初学者,所以很多见解一定会有偏差的,望各位高手多多提点提点。恩,不磨叽了,开始吧。

*************************************************************************
关于译序和前言主要讲述的是作者重作冯妇的原因,对于这个我是很赞同的。的确,《c++ primer》不适合初学c++的人阅读,因为它太庞大了,太细致入微了,尤其是对于想我这样刚接触编程的人来说。花了我一个学期的时间也只看了四分之三,由于知识太多了,边看遍忘,结果就需要看一段时间就重头看一次,弄得我第一篇看了三四遍。记得最一开始我看了一点点《The C++ Programming Language》,Bjarne在一开始就强调,不要过于注重语言的细节问题,应该对语言有个整体上的把握。等到学期末的时候我才注意到自己一直在追求细节问题,不过我感觉不是我过于追求,而是primer中写的太详细了,而对于有点强迫症的我来说,既然作者写了,作为读者的我当然要记住了啊。嗯,所以,对于c++的整体把握是一点都没有啊。我便想,我应该由简入繁,先在整体上了解c++,不必细致,知道它都有什么性质,都有什么,就够了。所以我打算找本仅仅是介绍c++,而又不会过于强调细节的书。幸运的是,我找到了。而让我激动的是,《Essential C++》和《C++ Primer》都是一个作者,对比下目录,又有很大的相似,所以我便打算先把essential看一遍,对c++有个大致的把握后,在复习的时候同时看primer,这样的收获应该会更大。这便是我看此书,又认真做了笔记的原因。
*************************************************************************

第一章C++ 编程基础

1.1如何撰写c++程序

每一个c++程序都有一个main函数,main函数是唯一被操作系统显示调用的函数,所以程序都是从main函数开始执行。其通用形式如下:
int main(){
                     //我们的程序代码置于此处
               }
int是c++中的关键字,关键字是程序语言先行定义好的一些具有特殊意义的名称。int表示内建的整数数据型别。
main并非是程序语言定义的关键字。但是,在执行我们这个c++程序的编译系统时,会假设程序中定义有main()函数。如果没有,程序将无法执行。
关于c++中的数据输入输出,以及对文件的读写并不是语言自身定义的一部分。而是由c++的一套面向对象类体系提供支持,并作为c++标准程序库的一员。
关于类机制,赋予我们“增加程序内之型别抽象化层次”的能力。class的定义,一般来说分为两个部分。关于类的定义放入头文件中,而类的成员函数的具体实现部分应放入源文件中。关于头文件与源文件的布置是个很严肃的问题,后面会提到。
字符串常量内可以同时包含可打印字符和不可打印字符,如:
cout<<"hello world!"<<'\n';
cout<<"hello world\n";
这两个是相同的,记得刚学c++时就跟一个同学讨论这个问题,当时就是没理解第二个。
关于命名空间的问题,书中介绍了下作用:所谓命名空间是一种将程序库名称封装起来的方法。通过这种方法,可以避免和应用程序发生命名冲突的问题(所谓命名冲突是指在应用程序内两个不同的实体具有相同的名称,导致程序无法区分两者。命名冲突发生时,程序必须等到该命名冲突获得决议之后,才得以继续执行)。命名空间像是在众多名称的可见范围之间竖起一道道围墙。

1.2对象的定义与初始化

每个对象都隶属于特定的数据型别。该型别决定了对象所能含有的数值范围,同时决定了对象应该占用多少空间

关于转义字符:
cout<<'\n'<<'\t'<<user_name;    //以前都这么写
cout<<"\n\t"<<user_name;        //还没这么写过
一定要正确区分对象的定义、初始化、赋值这三者间的区别。
定义对象时,是在内存中开辟了相应大小的空间给这个对象。而此时对象的值是不确定的。在定义对象时给对象值叫做初始化。初始化有两种方式,一是直接初始化:int val(9);二是赋值初始化:int val=9;。
对于基本内置类型来说这两种方式并无差别。对于仅含有一个数据成员的类来说,这样也是可以的。如string:
string str=“string“;
string str(”string“);
这是一样的,调用的都是该类的构造函数。我记得在那儿看的有人说第一个调用的是operator=,这是不对的,因为此时是初始化该对象,该对象在创建当中。只有当对象存在之后,是有赋值操作符才是调用operator=。如:
string str,str2(”string“);
str=str2;        //这是调用operator=
当我们在程序中使用文件路径时,对于windows系统,文件路径中的分隔符应该打上两个\:
"F:\\essential\\programs\\chapter1\\ch1_main.cpp";
由于反斜线字符已被用来作为“转义序列”的起头字符,所以连续两个反斜线即表示一个真正的反斜线。不过对于Mac os,文件间的分隔符用的是/,所以不用打两个。

1.3撰写表达式

以前写每行输出五个时都是定义一个整数,每次都if语句判断,%5等于零时输出换行,否则输出空格,不过书中是这么写的:
cout<<a_string<<(cnt%line_size?' ':'\n');
虽然作者的目的是为了引出? :三元运算符,不过还是亮了我一下,深以为自己太笨了。
关于符合赋值运算符,记得好像是primer中说的,其效率比一般的运算后再赋值快,毕竟这只是算了一遍。
运算符的优先级应该了解下,有时等编译器报错了,我才知道得加括号。

1.4条件语句和循环语句

关于条件、循环和分支语句虽然很简单,不过却很重要。一定要注意终止条件。还有连续多个if语句和一系列if-else语句的区别。前者每个都要判断,就如switch一般,第二个找到符合的之后剩下的就不再判断了。

1.5如何运用Arrays和Vectors

array的长度是固定不变的,而vector的长度是可变的。vector用起来更安全方便。若想知道array的长度只能是用sizeof,字符数组还有个strlen,不过当在函数间传递数组头指针时,sizeof就不好使了。还是vector的size()比较好啊。vector的初始化方式有很多,都很方便,此处就不一一说明了。本书的重点在于后面介绍各个编程风格。

注意,c++中只有一维数组,没有所谓的二维数组、三维数组等等。所谓的二维数组就是元素是数组的数组。

1.6指针带来弹性

对于指针,我是非常喜欢。就是因为它很底层。对于指针要说的就是,在同种位的系统上,各种指针的大小是一样的。不会因为它所指向的对象类型的不同而不同。可以用sizeof试一下。正因如此,指针的弹性是很大的。而且使用指针是很灵活的,但是对于指针的使用一定要小心。很多初学指针的朋友总是会很闹心,我刚学的时候就是,但是只要理解了,也就好了。我在网上找到了一篇专门讲解指针的书,是一位前辈写的,就在我的资源里,大家可以看看。而关于指针的弹性,多写代码就会有感觉了(不负责任的说)。

1.7文件的读写

c++对于文件的读写是十分简单的。首先要#include<fstream>
要想写文件,就要先定义一个ofstream对象,读文件就是ifstream对象,要即读又写就是fstream。一开始总是弄混ifstream和ofstream,分不清哪个是读,哪个是写。以程序为主就好了,程序写文件就是ofstream,程序读文件就是ifstream。
操作前要确定文件正常打开:
ofstream outfile(“seq_data.txt");
if(!outfile)    //若out file的结果为false,表示文件打开失败
//................
文件有几种打开模式:
 
如上例,若想在文件尾继续写东西就应该这样初始化:
ofstream outfile("seq_data.txt",ofstream::app);
书中有个例子:

fstream iofile("seq_data.txt",ios_base::in|ios_base::app);

if(!iofile)

   //由于某种原因,文件无法开启

else{

//在开始读取之前,将文件重新定位至起始处

iofile.seekg(0);

}

第一行的意思是读取文件,而且在每次写之前将文件位置定位在尾端。但这样当每次读文件时便会读到文件尾,seekg(0)可将文件位置重新定位置文件起始处,这样读的时候是从头读,写的时候是写在文件尾。
       
本书的内容对于c++的语法知识讲解的很少。但我感觉本书依然很好,因为书的2、3、4、5、6章介绍了各种c++的编程风格。我最喜欢3.6节,关于泛型算法的设计思想。



原创粉丝点击