本系列为本人学习21天学通C++这本书的读书笔记,这是一本C++入门的好书(一本被书名耽误的好书)。
1. 编写C++应用程序
1.1 生成可执行文件的步骤
- 使用文本编辑器编写C++代码。
- 使用C++编译器对代码进行编译,将代码转换为包含在目标文件中的机器语言版本。
- 使用链接器链接编译器的输出,生成一个可执行文件(如Windows中的.exe文件)
1.2 编写第一个C++应用程序
#include <iostream>
int main(int argc, char *argv[]) {
std::cout << "Hello World!" << std::endl;
return 0;
}
1.3 生成并执行第一个C++应用程序
- 如果您使用的是Linux 系统,请打开终端,切换到文件Hello.cpp 所在的目录,再使用如下命令行调用g++编译器和链接程序:
g++ -o hello Hello.cpp
- 该命令行让g++编译C++文件Hello.cpp,并创建一个名为hello的可执行文件。
Q&A
-
解释型语言与编译型语言有何不同?
- 诸如Windows Script等语言是解释型的,不需要编译。解释型语言使用解释器,解释器直接读取脚本文件(代码)并执行指定的操作。因此,要在计算机上执行脚本,必须安装解释器。在运行阶段,解释器在微处理器和代码之间充当翻译,因此性能通常会受到影响
-
什么是运行时错误?它与编译时错误有何不同?
- 执行应用程序时发生的错误称为运行时错误。在较旧的Windows版本中,您可能遇到过臭名昭著的“非法访问(Access Violation)”错误,它就是运行时错误。最终用户不会遇到编译时错误,这种错误表明程序存在语法问题,会禁止程序员生成可执行文件
-
解释器和编译器有何不同?链接器的作用是什么?
- 解释器是一种对代码(或字节码)进行解释并执行相应操作的工具;编译器将代码作为输入,并生成目标文件。就C++而言,编译和链接后,将得到一个可执行文件,处理器可直接执行它,而无需做进一步解释
- 编译器将C++代码文件作为输入,并生成一个使用机器语言的目标文件。通常,您的代码依赖于库和其他代码文件中的函数。链接器负责建立这些链接,并生成一个可执行文件,它集成了您指定的所有直接或间接依存关系
2. C++程序的组成部分
2.1 Hello World程序的组成部分
2.1.1 预处理器编译指令#include
- 预处理器是一个在编译前运行的工具。预处理器编译指令是向预处理器发出的命令,
总是以磅字符#打头 - 如果需要在FileA 中使用FileB中定义的元素,就需要在前者中包含后者。为此,通常在FileA 中使用如下include语句:
#include "...relative path to FileB\FileB" // 这里使用引号而不是尖括号来包含自己创建的头文件。尖括号(<>)通常用于包含标准
头文件。
2.1.2 程序的主体—main( )
- 在很多C++应用程序中,都使用了类似于下面的main( )函数变种:
int main (int argc, char* argv[]) // 括号内的内容是提供给程序的参数
- cout(控制台输出)是将Hello World显示到控制台(即屏幕)的语句
- cout是在名称空间std中定义的一个流(因此这里使用了std::cout),这里使用流插入运算符<<将文本Hello World放到这个流中
- std::endl用于换行,将其插入流中相当于插入回车
std::cout << "Hello World" << std::endl; // 实际文本(包括引号)“Hello World”被称为字符串字面量
2.1.3 返回值
- 在C++中,除非明确声明了不返回值,否则函数必须返回一个值
- 在很多情况下,一个应用程序被另一个应用程序启动,而父应用程序(启动者)想知道子应用程序(被启动者)是否成功地完成了其任务。程序员可使用main( )的返回值向父应用程序传递成功或错误状态
- 根据约定,程序员在程序运行成功时返回0,并在出现错误时返回−1。然而,返回值为
整数,程序员可利用整个整数范围,指出众多不同的成功或失败状态
2.2 名称空间的概念
- 在第一个程序中,使用的是std::cout而不是cout,原因在于cout位于标准(std)名称空间中;名称空间是给代码指定的名称,有助于降低命名冲突的风险
// using namespace 声明
#include <iostream>
int main() {
using namespace std;
cout << "Hello World" << endl;
return 0;
}
// 关键字using
#include <iostream>
int main() {
using std::cout;
using std::endl;
cout << "Hello World" << endl;
return 0;
}
2.3 C++代码中的注释
C++支持两种风格的注释。
- //指出从这里开始到行尾都为注释
- /* */表示它们之间的文本为注释,即便这些文本跨越多行
2.4 C++函数
- 函数让您能够将应用程序划分成多个功能单元,并按您选择的顺序调用
- 最著名的函数无疑是int main( ),它被编译器视为C++应用程序的起点,必须返回一个int(即整数)
// 声明、定义和调用函数
#include <iostream>
using namespace std;
// 函数声明
int DemoConsoleOutput();
int main() {
// 函数调用
DemoConsoleOutput();
return 0;
}
// 函数定义
int DemoConsoleOutput() {
cout << "This is a simple string literal" << endl;
cout << "Writing number five: " << 5 << endl;
return 0;
}
2.5 使用std::cin 和std::cout 执行基本输入输出操作
- 要将简单的文本数据写入到控制台,可使用std::cout;要从控制台读取文本和数字,可使用std::cin
// cin 的用法
std::cin >> Variable; // 提取运算符>>(从输入流中提取数据)
Q&A
-
#include 的作用是什么?
- 这是一个预处理器编译指令。预处理器在您调用编译器时运行。该指令使得预处理器将include后面的<>中的文件读入程序,其效果如同将这个文件输入到源代码中的这个位置。
-
什么情况下需要命令行参数?
- 需要提供让用户能够修改程序行为的选项时。例如,Linux命令ls和Windows命令dir都显示当前目录(文件夹)的内容,要查看另一个目录中的文件,需要使用命令行参数指定相应的路径,如ls /或dir \。