Archive for 4 月, 2010

C++ Primer Chapter1

星期三, 14 4 月, 2010

1、操作系统通过调用main函数来执行程序,(嵌入启动函数,操作系统调用启动函数。在启动函数中进行C/C++运行时库的初始化等工作,最后调用main函数执行程序。参考资料:C运行时库),main函数则执行组成自己的语句并返回一个值给操作系统。

操作系统通过main函数返回的值来确定程序是否成功执行完毕。返回0值表示程序成功执行完毕。返回值的作用:如在一个程序(A)中调用另一个程序(B)处理任务,程序A通过程序B的返回值判断任务执行情况,并及时处理。参考资料:main函数返回值作用

main函数是(唯一)被操作系统显式调用的函数。

2、定义函数必须指定4个元素:返回类型、函数名、圆括号内的形参表(可能为空)和函数体。

main函数的返回值必须是int型。这是标准规定。参考资料:C语言之main函数返回值问题分析

3、在大多数系统中,main函数的返回值是一个状态指示器。返回值0往往表示main函数成功执行完毕。任何其他非零的返回值都有操作系统定义的含义。通常非零返回值表明有错误出现。每一种操作系统都有自己的方式告诉用户main函数返回什么内容。

访问main函数的返回值的方式和系统有关。不论UNIX还是Windows系统,执行程序后,必须发出一个适当的echo命令。UNIX系统中,通过键入如下命令获取状态:

$ echo $?

要在Windows系统下查看状态,键入

C:\directory> echo %ERRORLEVEL%(显示程序main函数的返回值)

4、调用GNU编译器的默认命令是g++:

$ g++ prog1.cc -o prog1

这里的$是系统提示符。这个命令产生一个名为prog1或prog1.exe的可执行文件。在UNIX系统下,可执行文件没有后缀;-o prog1是编译器参数以及用来存放可执行文件的文件名。如果省略-o prog1,那么编译器在UNIX系统下产生名为a.out而在Windows下产生名为a.exe的可执行文件。

微软编译器采用命令cl(compile-link 编译-链接)来调用:

C:\directory> cl -GX prog1.cpp

cl是调用编译器的命令,-GX是一个选项,该选项在使用命令行界面编译程序时是必需的。

5、流是指要从某种IO设备上读入或写出的字符序列。属于“流”试图说明字符是随着时间顺序生成或消耗的。(流就是一种序列。)

6、标准库定义了4个IO对象:istream的cin、ostream的cout、cerr、clog。

一般情况下,系统将这些对象与执行程序的窗口联系起来。这样,当我们从cin读入时,数据从执行程序的窗口读入,当写到cout、cerr或clog时,输出写至同一窗口。

7、当操作符是输出操作符(<<)时,结果是左操作数的值。也就是说,输出操作返回的值是输出流本身。

endl是一个特殊值,称为操纵符,将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区。通过刷新缓冲区,用户可立即看到写入到流中的输出。

8、在写C++程序时,大部分出现空格符的地方可用换行符代替。这条规则的一个例外是字符串字面值中的空格符不能用换行符替代。另一个例外是空格符不允许出现在预处理指示中。

9、定义变量时,应该给变量赋初始值,除非确定将变量用于其他意图之前会覆盖这个初值。如果不能保证读取变量之前重置变量,就应该初始化变量。

10、当注释跨多行时,最好能直观地指明每一行都是注释。我们的风格是在注释的每一行以星号开始,指明整个范围是多行注释的一部分。如:

//
//
//
/*
 *
 */

太多注释混入程序代码可能会使代码难以理解,通常最好是将一个注释块放在所解释代码的上方。

临时忽略一段代码更好的方法,是用编辑器在要忽略的每一行代码前面插入单行注释。

11、for(int val = 1; val <= 10; ++val)退出for循环后,变量val不可再访问,循环终止后使用val是不可能的。然后不是所有的编译器都有这一要求。

12、while(std::cin >> value)当我们使用istream对象作为条件,结果是测试流的状态。如果流是有效的(也就是说,如果读入下一个输入是可能的)那么测试成功。遇到文件结束符或遇到无效输入时,如读取了一个不是整数的值,则istream对象是无效的。处于无效状态的istream对象将导致条件失败。

13、操作系统使用不同的值作为文件结束符。Windows系统下我们通过键入control-z,来输入文件结束符。Unix系统中,包括Mac OS-X机器,通常用control-d。

14、标准库的头文件用尖括号<>括起来,非标准库的头文件用双括号””括起来。

15、点操作符通过它的左操作数取得右操作数。点操作符仅应用于类类型的对象:左操作数必须是类类型的对象,右操作数必须指定该类型的成员。与大多数其他操作符不同,点操作符的右操作数不是对象或值,而是成员的名字。

16、缓冲区 一段用来存放数据的存储区域。IO设备通常存储输入(或输出)到缓冲区,并独立于程序动作对缓冲区进行读写。输出缓冲区通常必须显式刷新以强制输出缓冲区内容。默认情况下,读cin会刷新cout;当程序正常结束时,cout也被刷新。

cerr 默认情况下,输出cerr不带缓冲。

clog 默认情况下,写到clog时是带缓冲的。

操纵符 在读或写时“操纵”流本身的对象,如std::endl。

未初始化变量 类类型没有未初始化变量。没有指定初始值的类类型变量由类定义(即构造函数)初始化。

Tencent

星期二, 13 4 月, 2010

构造函数、析构函数能是虚函数吗?为什么?
构造函数如果为虚,也就是假设虚机制在构造函数中起作用的话,你构造的对象极其有可能建立在来未构造的对象资源上,会令构造以失败告终。构造函数仅仅构造当前对象所需要的资源。
一个类拥有虚析构函数表明它是一个基类。用虚析构函数是为了解决当用基类的指针指向派生类时,如果删除此指针,要调用派生类的析构函数(虚函数的作用)。

什么是多态?
允许父类指针或名称来引用子类对象,或对象方法,而实际调用的方法为对象的类型方法。
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。

unicode utf-8
unicode 2个字节 utf-8 1-4个字节 utf-16 2或4个字节

动态规划
把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。
多阶段决策。

单向链表逆转
http://javaboy2006.javaeye.com/blog/181303
http://cid-889b2ac6dc1ce102.spaces.live.com/blog/cns!889B2AC6DC1CE102!http://blog.csdn.net/tmljs1988/archive/2008/08/28/2841509.aspx