CHARLORÉ / AQUATIC MEMORY

Charloré

C++ Primer Fifth Edition notes(1)

1994 字
10 分钟
C++ Primer Fifth Edition notes(1)

1.1#

1 main 有返回值表示程序状态#

main 函数调用者是操作系统。

int main() {
return 0;
}

return 0;

  1. 结束程序
  2. 向操作系统返回状态值 0

2 源文件只是保存 C++ 代码的文本文件,不是可执行程序#

后缀:.cpp

3 编译器生成可执行文件#

prog.cpp → 编译器 → prog.exe

4 .\prog​ 表示运行当前文件夹中的 prog.exe#

5 如何读取 main 返回给系统的状态值?#

UNIX 中,$? 表示刚刚执行的程序返回的状态值。

例如返回 0 时:

Terminal window
$ ./prog1
$ echo $?
0

Windows 中使用%ERRORLEVEL%

例如:

Terminal window
C:\> prog1
C:\> echo %ERRORLEVEL%
0

6 g++ 编译器如何编译一个源文件?#

GNU C++ 编译器的命令名是 g++。

编译命令:

Terminal window
g++ -o prog1 prog1.cc

含义:

g++ -o prog1 prog1.cc
│ │ │ │
│ │ │ └─ 输入:要编译的源文件
│ │ └───────────── 输出:生成的可执行文件名
│ └────────────────────── 指定输出文件名
└──────────────────────────────── GNU C++ 编译器

-o​ 表示将编译结果命名为 prog1。

省略会使用默认名称:

UNIX: a.out
Windows: a.exe

7 Microsoft C++ 编译器如何编译一个源文件?#

命令名是 cl。

编译命令:

Terminal window
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::cin
std::cout
std::string
std::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) ,用于输出警告和错误信息,输出到控制台。

‍

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

C++ Primer Fifth Edition notes(1)
https://charlore.cn/posts/c++-primer-fifth-edition-notes-1/
作者
路人蛃
发布于
2026-09-15
许可协议
CC BY-NC-SA 4.0

评论区