从今天开始学习C++,争取一年之内把《C++ Primer Plus》看上两遍,平均一周看一章,并做课后对应习题。
今天把《C++ Primer Plus》的第二章看完了,因为只是一些涉及到C语言和C++的简单的基础知识,所以看的速度非常快,一下午加一晚上就把书仔细的看了一遍,并将课后习题做了一下。虽然内容很简单,但还是得到了一些新的东西。下面将今天看的需要注意的基本点总结一下。
本章主要讲了C++中最基础的知识,main()函数、头文件、预处理、C++中的一些简单语句、名称空间、函数、用cin、cout进行输入输出等。
1. 函数简介
函数包括函数头和函数体。函数头描述了函数与调用它的函数之间的接口,包括函数名称、传递给函数的参数信息和函数的返回值类型三个部分。main()函数是最基本的函数,main()函数被启动代码调用,而启动代码是由编译器添加到程序中的,是程序和操作系统之间的桥梁。可以将操作系统看做调用程序。因此main()的返回值不是返回给程序的其他部分,而是返回给操作系统。
2. main函数的格式
在C语言中,省略返回类型相当于说函数的类型为int(如经典C函数头:main() )。然而C++逐渐淘汰了这种用法;
有些程序员使用void main()函数头,并省略返回语句,这在逻辑上是一致的,因为void返回类型意味着函数不反悔任何值。这种形式适用于很多系统,但由于它不是当前标准强制的一个选项,因此在有些系统上不能工作。所以我们应避免使用这种形式;
我们应使用C++标准格式:int main()或者int main(void)
3. #include的作用
预处理编译指令#include<文件A>的作用是:在对程序进行预处理时,会将文件A的内容添加到程序中,这是一种典型的预处理操作:在程序执行之前,替换或添加文本。如 在程序中使用cin和cout进行输入输出时,必须要包含此头文件:#include<iostream>。因为在使用cin和cout进行输入输出时,需要使用iostream文件中的多个定义(cin和cout其实分别是在iostream文件中istream类和ostream类的一个对象,这些类和对象的定义都在文件iostream中,所以需要iostream文件),#include编译指令将导致iostream文件中的内容随源代码文件的内容一起呗发送给编译器。实际上iostream文件的内容在预处理过后将取代代码行#include<iostream> 。
4. 名称空间
名称空间支持是一项C++特性,旨在让用户在编写大型程序以及将多个厂商的代码组合起来时更容易。因为在使用多个厂商的代码或者由多人编写一个大型程序时,在对函数进行命名时很有可能重合,这个时候编译器将不知道使用哪个版本的函数了。比如现在要使用两个封装好的产品,这两个封装好的产品中都包含一个名字为nll()的函数,这样在使用nll()函数时,编译器就不知道要使用哪个版本的nll()函数了。名称空间让厂商能够将其产品封装在一个叫做名称空间的单元中,这样就可以用名称空间的名称来指出想使用哪个厂商的产品。因此A公司可以将其定义放到一个名为A的名称空间中。这样nll()函数的全称为A::nll()。同样,B公司的nll()版本可以表示为B::nll()。
如果使用iostream,则用using namespace std;来使iostream中的定义对程序可用。若该语句放在函数定义前,则文件中的所有函数都可使用名称空间std中的所有函数;若放在特定的函数定义中,则该函数能够使用名称空间std中的所有元素;在特定的函数中使用类似using std::cout;这样的指令,则该函数能够使用特定的元素cout;完全不使用编译指令using,而是直接在要使用的元素前加上std::。如:std::cout<<"abcd"<<endl; 这样即使函数中没有using namespace std; 和using std::cout;这样的句子,程序也可以正常运行。
5. 使用cout进行输出
如语句cout<<"abcde";其中的<<是一个插入运算符,这个语句可以理解为:将“abcde”字符串插入到输出流中。<<插入运算符与按位左移运算符是一样的,这是一个运算符重载的例子。编译器可以根据上下文来确定其含义。
6. 控制符endl
endl是一个特殊的C++符号,表示一个重要的概念:重启一行。打印字符串时,cout不会自动移到下一行,每条cout语句的输出从前一个输出的末尾开始,如:
cout<<"the good,the";
cout<<"bad, ";
其输出将会是:the good,thebad,
如果加上一个endl即:
cout<<"the good,the"<<endl;(endl与换行符\n的作用相同,即这条语句相当于cout<<"the good,the\n";)
cout<<"bad, ";
其输出为:the good,thebad,
7. 变量声明
为什么变量必须声明? 因为如果不进行变量声明就可以直接使用,如果错误的拼写了变量名,就会在不知不觉中创建了一个新变量。例如:
castledark = 34;
castledank = castledark+5;
由于castledank是拼写错误,因此上面的语句并没有修改castledark,而是不知不觉中创建了一个新的变量castledank。这种情况很难发现,因为如果可以不进行变量声明的话,这两条语句是不违反任何语法规则的。正是因为使用变量前必须进行声明,所以如果碰到上面这种拼写错误的情况,代码将会违反“使用变量前必须声明”这种情况,编译器就会报错,从而发现问题。而不会在不知不觉中创建一个新变量。
在C中,所有的变量声明都位于函数或者过程的开始位置,但C++中没有这种限制。通常在C++中,一般都是在首次使用变量前声明它。这样就不必在程序中到处查找,以了解变量的类型。但是没有将所有的变量名放在一起,无法对函数使用了哪些变量一目了然。
8. 使用cin进行输入
输入时,cin使用>>从输入流中抽取字符,可以看做从键盘流入程序,通常在运算符右侧提供一个变量来接收抽取的信息。
9. 函数
函数原型(及函数声明)只描述了函数接口,不能将其与函数定义相混淆,在使用C++中的库函数时,要将库函数相对应的头文件加进去(用#include)。头文件中只包含了函数原型,库文件中才包含了函数的编译代码。编译器编译程序时,必须在库文件中搜索所使用的函数。头文件只可以提供函数原型,但不一定会导致编译器搜索正确的库文件。
通常在C++中,若要自定义函数,通常把函数原型放在main()函数前面,把函数定义放在main()函数后面。
C++不允许将函数定义嵌套在另一个函数定义中,每个函数的定义都是独立的,所有函数的创建都是平等的。