C++Primer 读书笔记 第1章 开始

1.程序问题解决:分而治之(divide and conquer)  逐步求精(stepwise refinement)
2.main函数返回类型为整型,若无明确的定义,则返回0;
3:STD C++定义的预处理器 __cplusplus __TIME__ __STDC__ __DATE__ __LINE__ __FILE__
4:constructor&destructor均为类的成员函数
5:文字常量 literal constant 整值类型(integal type)默认为int类型,即有符号32位。
6:全局变量会被自动初始化,局部变量不会被自动初始化,但是类型对象会调用其默认构造函数。


预定义的目录:就是系统目录。标准库文件所在的地方,再说的直接点。就是你安装编译器所在的那个目录的某个子目录。
当前用户目录:

/以下参考了别人的:

注:本笔记用的是中国电力出版社的《c++ primer》第三版中译本,潘爱民主编的

第一:对oop的理解,

这里我不得不指出在国内大部分本科教材中把封装性作为oop的独有的特点之一、以
至于让很多人(包括我)认为写了个class就进入了oop的大门,这本书就明确的指出
数据的封装只是对象的特点。是ADT的结果,设计方法的划分中属于基于对象(obj
ect based),没有inheritance机制和dynamic binding(动态绑定)的扩展就根本
谈不上oop。

第二:对c++的认识

作者明确指出c++是一种多种设计方法集于一体的语言。而我们更多的是把他作为一
种oop的语言来学习,把c++理解为带类的c,个人认为这种错误的观点导致的一个严
重的问题是,我们带着c的思想来学习c++,使得我们在应用过程中用的是c++东西。
比如class。I/o流,但是我们思想还是c的,这使得我们难以接受oop以及其他设计
方法;这使得我对认为学习c++,未必要学c的这种观点的真理性更深信不疑、

第三:对编程习惯的认识

在1.1节中作者提出了一个问题。而不是像很多教材千篇一律的以"hello world"开
头。其实,我一直反对学习一种语言一上来就动手的习惯、正如这本书那样,从思
维入手,对于任何问题都以一个工程的态度去面对,在这里作者提出了分而治之和
独步求精的思想。对于一个还没养成坏习惯的初学者来说,这好处实在不可估量。


1.2节

在1.1节中,作者提出一个问题并用分而治之和独步求精的思想给出了解决方案,我
在这里再重复一遍。在学习一个新东西之前。该从它的思想入手,我的建议是:在
读完第二篇之前最好不要动手上机,这样做的好处是你可以避免很多莫名其妙的笨
问题。关于这点,我会在以后的笔记中试图证明。

在本节中,作者又提出了一种重要的东西。渐进式设计方法,我第一次看到这种方
式是在那本伟大的《The C Programming Language》中,这种思想对于我来说实在
是受益匪浅。作者在这里的解释是:"为控制在一个程序中不可避免的错误提供了一
个良好的方法 ,"在我看来。其好处远远不止如此。在学习过程中,这种方法使得
我们更清楚的知道每次增加的新东西的作用,这个好处在本节中得到了很好的体现
。在这个设计过程中,作者教给我们四个方面的东西。最基础的东西。

第一:基本概念

很多人认为,这本书不适合真正意义上的初学者。在今年第二期《程序员》中就提
到:在读这本书之前。你至少要有那么一点编程知识,个人认为这样的说法不是绝
对的。只要你认真的读。深入的理解这部分内容,什么是深入的理解呢?举个例子
:在讲到标识符的时候,作者提出了两个其它的名字。符号变量和对象。有点经验
的人都知道。变量和对象是有区别的,那么当我们写下这样的句子时

int a;

我们是否能肯定a是一个整数变量呢?还是int类的对象呢?当然,我们如果增加点
东西就能判断了。

int a=10;//显然,这是一般变量的用法

int a(10)//这几乎是类对象的方法

除了引言中简单的说明,我们还没得到更多的关于对象的解释。我们还不能肯定。
但是做这样的思考是我们能做的。对初学者要求太高?or yes,但是对这种习惯的
养成是绝对必要。

第二:关于编译器的有关说明

这块我最大的收获是明白了using和。h的关系,很多初学者的讨论就是关于这个。
这也是一上来就动手的弊端,他们根本不明白自己在用什么东西。况且页底的说明
告诉我们这还要看编译器的情况。因此有时候这个是对的,换了个地方就错了。看
了这段,至少节省了你很多问笨问题的时间。接下来是编译器的查错功能。显然这
儿只有两类。这可以告诉了你对于编译出错的候,你要努力的方向。

第三:关于数据类型

这里作者告诉我们两类数据类型,那就是内置的基本数据类型和扩展的基本数据类
型。在读这段的时候。有两个问题使我非常纳闷,第一个问题是:我们那可悲的 本
科教材中内置的少了一个(bool),扩展的完全没有。我把这个问题扔给了我的教
授。可是他的回答使我更纳闷了。他说这些是新东西(他指的是1998年的标准。前
言中有说明)、关于这点,我不方便说什么(我期末的生杀大权在他手里)。我只
想提醒大家现在2004年了。我的另一个问题是为什么没有数组和指针?在我读到2.
1节前这个问题一直留着。我在这里不想说我的理解。我只想给初学者一个建议,第
一篇的东西是有点难度的,我们该学会在读这些东西时,提出自己的问题并且给出
自己认为合理的答案,或者干脆留在脑子里,到你悟了,你会感到无比的。。。恩
。我把它叫做"成就感"吧

第四:控制语句

1.3节到1.4节

说来惭愧,在学c的时候对于1.3节中所讲的内容就没有好好读过,以至于在相当长
的一段时间里,过得糊里糊涂的,当然,主要的责任在我自己。但是,背了这么大
的罪,有点不甘心。恩,得找点理由。我的理由是:正如大部分朋友那样,学c是从
谭浩强那本书开始的,单文件的习惯简直是深入人心。在大谈特谈之后。他老人家
大概觉得不好意思,书的最后才拿出来亮下,而我这个笨蛋自以为读了那么多,已
经大功告成了,也没放在心上,上面的这些废话,只想说明一点。那就是读好书是
绝对必要的。

在1.3节里,作者以最简单的语言回答了初学者一定会问的笨问题:

第一:关于include指令

很多人都会问。#include<>和#include" "有什么区别?书上的回答很明白,对头文
件查找的方式不同而已。可能我们唯一不满意的是。作者没有告诉我们什么是预定
义的目录,汗,看来作者还是高估了我们这些可怜的人,所谓预定义的目录就是我
们通常说的系统目录。标准库文件所在的地方,再说的直接点。就是你安装编译器
所在的那个目录的某个子目录。什么是当前用户目录?别玩我了,你一定知道的。
除非你没用过操作系统。

第二:关于名字空间和头文件的习惯

c++对c的兼容性是大家都知道的。但是我们会很奇怪的发现当我们根据c++的标准写
法写下如下句子时

  #include<stdio>

  using namespace std;

编译器很不给面子。作者告诉我们原来c名字和c++名字是不同的。也就是说在名字
空间std111111111里根本就没有stdio这个东西。所有的c名字在c++名字中都得加个
c前缀,在也证明了我在上篇笔记里说的。一上来就动手上机的一大弊端就是我们根
本不知道自己在用什么。出了错当然也就莫名其妙了,

第三:关于某些识别符

由于c++对c的兼容,我们也许会问:我怎么知道那个是c文件,那个是c++文件呢?
看扩展名?这是个主意,但是,有个不幸的消息。作者已经多次告诉我们在不同的
系统里文件的扩展名是不同的,作者告诉我们一个很好的方法:用宏,c++有个"__
cplusplus"c有个"__STDC__"这两个名字不会同时存在。ok,这样的话,我们#ifnd
ef或者#ifdef就可以了,另外,作者还告诉我们四个宏,对初学者来说几呼没什么
用?呵呵,多懂点也是好的,这也是作者对我们的信任,不像某些教材,,,,唉
,不提也罢,什么是初学者的东西。什么不是。谁有这个权力判断呢?除了你自己
,教育者的任务该是把完整的东西拿来看,取舍是学生的事情,不是吗?

除了上面这些知识外,作者还告诉我们该养成那些好习惯。比如写头文件时,该写
成如下形式:

#ifndef  FILENAME_H

#define FILENAME_H

//文件主体,

#endif

以便当文件包涵层次多了犯糊涂,另外这里还有个暗示:鼓励写多文件程序,这样
可以避免一个文件过长难以读懂,我当年就写过一个长达1100行的文件。修改时,
我自己都晕了。还有个好处是,当我们学习I/O时文件操作就成可以理解的东西了,
尽管两者关系不大。但是这是一种思维习惯,如果你只写单文件的东西。你怎么理
解文件外的操作呢?

第四:注释

还有一种习惯就是注释,我把它并到这里来写,是因为它简单,但是简单并不意味
着不重要,相反,它很重要。无论在任何时候我们都不要忘记,人类能成为整个世
界的主宰,是因为我们的合作能力超过了任何一种生物(不明生物除外)。而注释
正是为你以后的合作提供方便,因为你的设计灵感是很容易忘记的,到时候,连自
己都不知道。这段代码干嘛的?

1.5节

本节的内容不是很难,学过一点编程的人都会很容易接受,但是,我一直以来就有
一种感觉。自己用的最多但又用的最糊涂的也就是i/o系统,很明显i/o实现了对计
算机设备的直接操作。在c++里我们知道它是通过ios类的对象来完成的。从感觉上
讲,远远不如c来的直接,明白。当然这样做的好处是大大简单了我们的操作,但是
不幸的是这会给我们的理解造成一定的困难,下面我将提出自己疑问。

第一:关于预定义io对象的实现

大家都知道,我们的io操作是通过三个对象来完成的。cin、cout、cerr。作者在描
述的时候用了"绑定"这个词,很明显被抽象的数据类型和具体设备实现了完美的对
接。但是我的问题是,从ADT的思路来说,这些对象封装了那许数据?提供那些操作
?这些数据和接口是如何对设备进行控制的?很显然,以我们现在的知识很难回答
这些问题。就算是自以为合理的估计也不能,但是这样的思考,有助于我们对类设
计思维的熟悉,但是思考到此为止罢。不然我就误人子弟了。

第二:cout和cerr的区别

还有一个问题,初学者也许会问,作者告诉我们cout和cerr都可以用来输出。他们
的区别一个是一般的输出,一个是输出错误信息。可是这样的解释并不能使我们这
些好奇的人满意。于是我做了个恶作剧,改写了我们那个知名的"hello world!"

int main() {

            cerr<<"hello world!"<<endl;

            return 1;

         }

      事实证明 用户如果不看代码。他们不会知道自己看到的是个err。那么这两
个对象的区别只是个习惯或约定吗?我们同样不能解释。把它留着罢,相信总会"悟
"的

第三, 我想谈谈那个"endl",在很多教材里把它等价于"/n"正确吗?no,你可以写
下如下句子。

cout<<"aaa";

a=getchar();//.假设a已经定义

cout<<a;

在VC6中你会发现输入输出的顺序乱了(刚才在VC++.NET 2003又恢复正常了、奇怪。
因此不建议在c++中用c的东西),为什么呢?作者告诉我们endl除了/n的功能外还有
个刷新的功能,刷新什么?看仔细点,刷新缓冲区。什么是缓冲区?哦。这个问题
也许你需要一些别的知识,比如。《计算机组成原理》

关于文件的操作,与单文件非常类似,唯一要注意的是流进出的参照物、内存?or
文件?

一点提醒:

我还是要提醒大家。我提出了很多牛角尖的问题。只是对初学者的思考方法提出一
些个人建议。对于这些问题本身有些并没有讨论价值。有些不是现在该解决的问题
。在这节里你的任务其实很简单,搞清每个对象和运算符的作用。就是这样,c++之
父把c++说成难学易用的语言,我们可以理解这句话的涵义。要不断的想起这句话,

///

名称C++来自于C语言中的递增操作符++,该操作符将变量加1。名称C++表明,她是C的扩充版本。

在模板特征被使用和改进以后,人们才逐渐意识到,它们和OOP同样重要---甚至比OOP还重要,但有些人不这么认为。

C++融合了OOP、泛型编程和传统的过程式编程方法。


C++程序运行的大体步骤:

1) 编写并保存源代码;

2) 编译源代码并生成目标代码(object code);

3) 链接源代码并生成可执行代码;

通常,IDE允许在辅助窗口中运行程序。程序在执行完毕后,有些IDE将关闭该窗口,而有些IDE则不关闭。如果编译器关闭窗口,而为了查看输出,必须在程序的最后加上一些代码:

    cin.get(); //add this statement

    cin.get(); //and maybe this, too

 return 0;

}

cin.get()语句读取下一次键击,因此上述语句让程序等待,直到按下Enter键(在按下Enter键之前,键击将不被发送给程序,因此按下其他键都不管用)。如果程序在常规输入后留下一个没有没有被处理的键击,则第二条语句是必要的。例如,如果要输入一个数字,则需要输入该数字,然后按Enter键。程序将读取该数字,但Enter键不被处理,这样他被第一个cin.get()读取。(*详见流)

IDE提供了用于创建源代码文件的文本编辑器、用于生成可执行文件的编译器和链接器以及其他资源,如工程管理和调试功能。然而,这些任务也可以在命令行环境中通过核实的工具来完成。

这是另两位网友写的,可参考学习一下:

http://blog.csdn.net/owl2008/category/24437.aspx?PageNumber=2


http://blog.csdn.net/yitaohust/archive/2005/11/27/537913.aspx 

http://www.1to2.us/C-Primer-Plus-(1-2-)-a167795.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值