C++ Primer Fifth Edition notes(1)
- 1C++ Primer Fifth Edition notes(1)本文
- 2C++ Primer Fifth Edition notes(2)
- 3C++ Primer Fifth Edition notes(3)
- 4C++ Primer Fifth Edition notes(4)

1.1
1 main 有返回值表示程序状态
main 函数调用者是操作系统。
int main() { return 0;}return 0;
- 结束程序
- 向操作系统返回状态值
0
2 源文件只是保存 C++ 代码的文本文件,不是可执行程序
后缀:.cpp
3 编译器生成可执行文件
prog.cpp → 编译器 → prog.exe4 .\prog 表示运行当前文件夹中的 prog.exe
5 如何读取 main 返回给系统的状态值?
UNIX 中,$? 表示刚刚执行的程序返回的状态值。
例如返回
0时:Terminal window $ ./prog1$ echo $?0
Windows 中使用%ERRORLEVEL%
例如:
Terminal window C:\> prog1C:\> echo %ERRORLEVEL%0
6 g++ 编译器如何编译一个源文件?
GNU C++ 编译器的命令名是 g++。
编译命令:
g++ -o prog1 prog1.cc含义:
g++ -o prog1 prog1.cc│ │ │ ││ │ │ └─ 输入:要编译的源文件│ │ └───────────── 输出:生成的可执行文件名│ └────────────────────── 指定输出文件名└──────────────────────────────── GNU C++ 编译器-o 表示将编译结果命名为 prog1。
省略会使用默认名称:
UNIX: a.outWindows: a.exe7 Microsoft C++ 编译器如何编译一个源文件?
命令名是 cl。
编译命令:
cl /EHsc prog1.cpp含义:
cl /EHsc prog1.cpp│ │ ││ │ └─ 要编译的 C++ 源文件│ └────────────── 开启标准异常处理└───────────────────────── Microsoft C++ 编译器8 要求编译器报告更多警告
GNU 编译器: -Wall
例如:
Terminal window g++ -Wall -o prog1 prog1.cc
Microsoft 编译器: /W4
例如:
Terminal window cl /W4 /EHsc prog1.cpp
9 如何选择特定 C++ 版本进行编译?
选择版本:-std=c++11(即 C++11 版本)。
例如:
Terminal window g++ -std=c++11 -o prog1 prog1.cc
C++98 是第一版 ISO C++ 标准,目前常用 C++17 和 C++20。
1.2
1 C++ 标准由两部分组成
C++ 语言本身: 编译器直接识别
例如:
int、for、if、return、函数、类、指针、引用等
C++ 标准库: 需要引入头文件#include <iostream>
例如:
std::cinstd::coutstd::stringstd::vector
2 流与 istream、ostream
流: 按顺序读写的字符序列。
istream:输入流类型。
cin:标准输入ostream:输出流类型。
cout:标准输出cerr:错误与警告信息clog:一般运行信息3 为什么不直接写cout
C++标准库的名称位于命名空间(namespace)std中。
std :: cout │ │ │ │ │ └── 标准输出对象的名称 │ └─────── 作用域运算符 └──────────── 标准库命名空间:: 称为作用域运算符(scope operator),用于指出一个名称属于哪个作用域。
1.5 类
1 什么是类?
C++允许通过类定义自己的数据类型,而int 是 C++ 内置类型。
例如:
Sales_item item;这条语句定义了一个名为
item、类型为Sales_item 的对象,定义在Sales_item.h中。它在结构上与下面的语句相同:
int number;
2 如何导入自定义类的头文件?
Sales_item 是教材为书店程序提供的类,用来表示一本书的销售数据,包括:
- ISBN;
- 售出的册数;
- 销售收入;
- 平均售价。
要在源文件中使用Sales_item,必须包含头文件:#include "Sales_item.h"。
类的重要特点:使用者可以使用类提供的功能,而不必了解其内部实现。
3 为什么标准库使用 <iostream>,自定义使用 "Sales_item.h"?
双引号 " " 通常用于自己编写或项目提供的头文件。
自定义头文件通常使用 .h,也可能使用 .hpp、.H 或 .hxx。
4 类定义对象的什么行为?(接口)
同一个运算符对于不同的类型有不同的含义。
例如:
对于整数:
int a = 2, b = 3;std::cout << a + b;
+表示普通的数值加法。对于
Sales_item:Sales_item item1, item2;std::cout << item1 + item2;
+表示合并两笔相同 ISBN 的销售记录:售出册数相加;销售收入相加;根据合计结果得到平均售价。
补充:接口
数据结构(Data Structure) 是一种存储数据的方式,并附带有支持对数据进行操作的算法。
所支持操作的集合被称为接口 (Interface / API / ADT) 。
接口是一种规范 (specification) :支持哪些操作(即问题!)。
接口描述需要这个数据结构提供什么功能。
指的是一个数据结构对外暴露的操作集合, 它只规定:可以存什么数据、可以执行什么操作、操作是什么意思,但不规定内部如何实现。
如栈(stack) 这个抽象数据类型的接口约定:
class Stack {public: void push(int x); // 压入栈顶 int pop(); // 弹出并返回栈顶 int top(); // 查看栈顶,不弹出 bool empty(); // 是否为空 int size(); // 元素个数};栈可以用数组实现,也可以用链表实现,接口不变。
补充:数据结构
数据结构是一种表示 (representation) :如何支持这些操作(即解决方案!)。
例如同样支持get()、set(),可以使用数组、链表、数、哈希表等,不同实现方式,数据结构的选择直接决定算法效率。
比如查一个元素,用无序数组是 O(n),用哈希表是 O(1),用平衡二叉搜索树是 O(log n)。
放到类身上,可以这样类比:类对外公开的部分,相当于一组接口。
| 抽象概念 | C++ 类中的对应物 | Sales_item 示例 |
|---|---|---|
| 抽象数据类型(ADT) | 类所定义的类型及其语义 | 一笔图书销售记录 |
| 抽象数据 | 对象在概念上表示的信息 | ISBN、销量、销售收入 |
| 接口 | 对外可用的操作,通常由 public 成员及相关运算符组成 | isbn()、>>、<<、+、+=、= |
| 对象 | 某个具体实例 | Sales_item item1; |
| 内部表示 | 非公开的数据成员 | ISBN、销量和收入具体怎样保存 |
| 实现 | 各项操作内部的代码 | += 怎样合并销量和收入 |
| 类定义 | C++ 用来组织接口、状态和实现的语言结构 | class Sales_item { ... }; |
可以理解为:Sales_item 类定义了图书销售记录这种抽象数据类型,同时向使用者提供操作接口,并隐藏其内部数据结构和实现。
5 为什么运算的含义可以由类来规定?
例如:
整数加法:
int value1, value2;std::cin >> value1 >> value2;std::cout << value1 + value2 << std::endl;
Sales_item加法:Sales_item item1, item2;std::cin >> item1 >> item2;std::cout << item1 + item2 << std::endl;
结构相同: 定义两个对象 → 读取两个对象 → 相加两个对象 → 输出相加结果。
对于 Sales_item,item1 + item2表示合并两笔相同 ISBN 的销售记录,可以使用 Sales_item 类为其对象规定的加法,即数据结构的内部实现是可以修改的。
6 如何使用文件重定向修改输入输出流?
std::cin本质是程序的标准输入通道, std::cout本质是程序的标准输出通道。
平时运行时:std::cin 从键盘获取内容;std::cout 把内容显示到终端窗口。
文件重定向把输入与输出通道从键盘与终端改接到文件与文件。
假设:
已经编译出了
addItems.exe,准备输入文件infile.txt。执行重定向: 在 PowerShell 中运行
cmd /c ".\addItems.exe < .\infile.txt > .\outfile.txt"。
.\addItems.exe:运行程序。
< .\infile.txt:让程序的 std::cin 从 infile.txt 读取。
> .\outfile.txt:让程序的 std::cout 写入 outfile.txt。
7 什么是成员函数?
成员函数(member function) 是定义在类内部、属于该类的函数,有时也称为方法(method)。
例如:
item1.isbn():调用属于对象item1 的isbn 函数,取得item1中保存的 ISBN。item1 . isbn ()对象 成员 调用
包括点运算符 .和调用运算符 ()
仅仅写item1.isbn只是访问这个成员函数,还没有调用它。
8 为什么错误信息要使用 std::cerr?
例如:
if (item1.isbn() == item2.isbn()){std::cout << item1 + item2 << std::endl;return 0;}else{std::cerr << "Data must refer to same ISBN"<< std::endl;return -1;}假设把正常结果保存到文件,如果错误信息也使用
std::cout,它就可能和正常销售数据混在一起,使输出文件无法继续处理。
std::cerr 对应标准错误(standard error) ,用于输出警告和错误信息,输出到控制台。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!













