C++ primer plus笔记整理 01

这本书算是我最开始看的编程书了,但是本人在实际运用中用的确实不是特别多,算是巩固学习也是复习吧,又返回去翻了以前的笔记,现在把个人觉得有必要的知识点都总结一下在这里(都是碎片知识…>_>):

1.关于程序的入口main()函数

通常,main()函数被启动代码调用,而启动代码是由编译器添加到程序中的,是程序和操作系统之间的桥梁。(事实上,这个{*int main()}*函数头描述的是main()和操作系统之间的接口)

注意这个:函数头是int main()这整个部分
        函数名称是main()

启动代码是什么呢:启动代码是系统上电或者复位后运行的第一段代码,是进入C 语言的main 函数之前需要执行的那段汇编代码
为什么需要这个启动代码:程序的运行需要具备一定的条件,如分配好外部数据空间,堆栈空间和中断入口等。另外,汇编代码可以更直接地对硬件进行操作,效率更高,这对启动中断等对时间要求更高的情况是非常必要的

事实上的过程是你的程序先经由编译器添加到程序中的启动代码调用,之后执行main函数当中的各项操作(分配注销空间,调用其他函数等),这时候才涉及到操作系统对程序的操作。

还有一点需要注意:只有在main()中,结尾无返回值时才会默认认为有一个return 0(这是ANSI/ISO C++标准协会针对C++使用者的太多抱怨作的一个让步,使得默认有个返回值了…..)

正常的情况是:C++程序中必须包含一个main(),否则就认为其是一个不完整的C++程序。
这个正常情况也有意外,如下:

1.在windows编程中,可以编写一个动态链接库DLL模块,这是在其他windows程序中可以使用的代码,其中就不需要main,因为它不是独立程序
2.用于专用环境的程序----如机器人中的控制芯片,就可能不需要main

2.C++预处理器和iostream文件

前言:
C/C++编译系统编译程序的过程为预处理、编译、链接。
预处理器是在程序源文件被编译之前根据预处理指令对程序源文件进行处理的程序。
预处理器指令以#号开头标识,末尾不包含分号。
预处理命令不是C/C++语言本身的组成部分,不能直接对它们进行编译和链接。
C/C++语言的一个重要功能是可以使用预处理指令和具有预处理的功能。
C/C++提供的预处理功能主要有文件包含、宏替换、条件编译等

预处理器是什么:预处理器是程序中用来处理输入数据,产生能用来输入到其他程序的数据的程序。预处理器的输出被称为将输入数据预处理过的形式,常用在之后的程序比如编译器中。
一些预处理器只能够执行相对简单的文本替换宏展开,而另一些则有着完全成熟的编程语言的能力。我们这里涉及到的大多都是文本替换,相当于翻译一些源代码,使得cpu在计算的时候能减少一些计算量。

这里简要整理一下就是:预处理器是将一些源代码翻译成一些计算机能很简单就弄懂的代码的程序,它得到的输出数据都是用来给编译器使用的,简而言之就是将数据格式化,在提交代码给编译器之前过滤一遍。

我们也知道了,#开头的命令并不是C/C++的代码,而是预处理指令,程序运行到这里会直接交给预处理器,进行一系列的预处理,才将程序继续下去。

#include,这一句的含义是将iostream文件中的内容添加到程序中,这是一种文本替换的预处理

3.到这里跨入另外一个知识点:名称空间管理

如果直接使用iostream,而不是iostream.h,那应该加上using namespace std;

#include
using namespace std;

以上代码表示这个程序中的所有输入输出函数(iostream)都来自名字空间std中,这样不会引入重名函数等问题。

std是一个类,C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。你声明了这一句using namespace std;表明你可以使用
std中所有的方法了。这种iostream其实是C++标准协会后期自己定的标准,方便管理名字空间。

早期版本的C++中的iostream.h中包含了相关的输入输出函数cout,cin等,所以直接引入即可。


后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在.h后缀的头文件里,c++标准为了和C区
别开,也为了正确使用命名空间,规定头文件不使用后缀.h。

因此,当使用时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用< iostream>的时候,该
头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。 

你也可以自己命名名字空间,如:

namespace mynamespace {
  int bar;
}
using namespace mynamespace;

//这之后bar就成了一个全局变量,随意使用了,我们使用的std加上#include是指在std中(C++标准库)的那个XXXX文件中的所有方法,编译的时候都会看成全局方法
//这里bar == mynamespace::bar,编译器会自己识别

总结一下:
这就是C++的一个标准统一问题,C++在之后的版本中为了更好的扩展和管理,必然要推出更有效的来管理各种新的类库方法,随着它越来越壮大,库越来越多,名字空间namespace很好的管理方法。
在大型的项目中,我们应该注意使用标准的namespace管理方法,不能贪图便捷。

你可能感兴趣的:(C++学习笔记)