《C++入门经典(第10版)》学习笔记

写在学《C++入门经典(第10版)》的时候,主要是记录一些以前没有注意,不知道的地方。

强力安利这本书,讲的浅显易懂,而且使用的技术都比较新,非常适合自学的人。

全文都是我一个字一个字打上来的,为了省事,会适量忽略一些不重要信息(比如要包含声明头文件,反正vs有提示,就不打了)。

第2章 C++基础知识

转义序列

名称转义序列
换行符\n
水平制表符\t
响铃符\a
反斜杠\
双引号"

此外, C++11 支持原始字符串字面值,适合于有大量字符需要转义的情况。
要求以R开头,而且字符串内容要放到圆括号内,圆括号外还要再加一对双引号。
以下代码输出字符串字面值 “c:\Windows"。

1
cout << R"(c:\Windows\)";

格式化带小数点的数字

传送门

第3章 更多的控制流程

枚举类型(选读)

枚举类型是值用一组 int 类型的常量来定义的类型。枚举类型就像是包含了一组声明常量的列表。
枚举类型中,两个或更多的命名常量可接受同一个 int 值。
如果不指定任何数值,枚举类型中的标识符会被自动分配一组连续的值,这些值的第一个是0,其余常量是上一个值增加1——除非显式指定了一个或多个枚举常量的值。

1
2
3
enum Direction { NORTH = 0, SOUTH = 1, EAST = 2, WEST = 3 }
enum Direction { NORTH, SOUTH, EAST, WEST }
//以上两条语句等价。

C++11 中引入了一种新的枚举,称为强枚举枚举类
为定义强枚举,在 enum 后添加关键字 class 就可以了。

再论递增操作符和递减操作符

++在变量之前,先递增再返回值;++在变量之后,先返回值再递增。

第4章 过程抽象和返回值的函数

一些预定义函数

名称说明
sqrt平方根
pow乘方(幂)(实参,返回值均为 double )
abs取 int 的绝对值
labs取 long 的绝对值
fabs取 double 的绝对值
ceil向上取整
floor向下取整
srand为随机数生成器提供种子值
rand随机数

强制类型转换

1
2
3
4
5
6
7
8
9
static_cast<目标类型>(表达式);
// int 转 double
static_cast<double>(3);

//强制类型转换的古老形式
类型名(表达式);
double(3);

//虽然说要尽量使用第一种,但是第二种打的字少一些,所以...

另一种形式的函数声明

函数声明中不一定要列出形参名称,以下两个函数声明等价:

1
2
double abc(int a, double b);
double abc(int, double);

但应坚持使用第一种形式,以确保可读性。

第5章 用函数完成所有子任务

传引用参数

有时候有奇效,用起来超级舒服。

1
2
3
4
// 普通的(传值调用函数)声明方法
int abc(int a);
// 传引用函数声明方法
int abc(int& a);

第6章 I/O流——对象和类入门

文件I/O

1
2
3
4
5
6
7
8
9
using namespace std;
ifstream inStream;
ofstream outStream;

inStream.open("infile.dat");
outStream.open("outfile.dat");

inStream.close();
outStream.close();

追加到文件(选读)

1
2
ofstream fout;
fout.open("data.txt",ios::app);

用流函数格式化输出

每个输出流的成员函数(部分):

标志含义
precision()指定小数点后不同位数
setf()设置标志
width()输出项占多少个空格(域宽)(用于左右对齐)

setf()的格式化标志:

标志含义
ios::fixed不用科学计数法
ios::scientific用科学计数法
ios::showpoint显示浮点数后面所有0
ios::showpos正整数之前会输出正号
ios::right右对齐
ios::left左对齐

任何标志都可以使用unsetf()取消。

操纵元

标志含义
endl这个不说了
setw和width完全一样
setprecision和precision完全一样

这玩意感觉挺多余的。。

字符串I/O

put(),get(),putback()

万用型流参数

适用于有时候是cin,有时候是输入文件流的情况。

名称关键字
输入流istream
输出流ostream

函数的默认实参(选读)

1
void newLine(istream& inStream = cin);

检查文件结尾

方法1:

1
2
3
4
5
6
7
double next, sum = 0;
int count = 0;
while (inStream >> next)
{
sum += next;
count++;
}

方法2:
eof成员函数。

预定义字符函数

第7章 数组

C++11基于范围的for语句

C++11中一种新的for循环,用于快速遍历数组元素。

1
2
3
int arr[]={1,2,3,4,5};
for(auto i : arr)
cout<<i;

甚至可以这样

1
2
3
4
5
int arr[]={1,2,3,4,5};
for(int& i : arr)
i++;
for(int i : arr)
cout<<i;

整个数组作为函数参数

和传引用参数用法差不多。
为了防止不经意间的修改,一般使用const修饰。

第8章 字符串和向量

预定义C字符串函数

函数说明提示
strcpy(Target_string,Src_string)将Src_string中的值复制到Target_string中不检查Target_string中最大可存储的容量
strcat(Target_string,Src_string)将Src_string中的值连接到Target_string末尾不检查Target_string中最大可存储的容量
strlen(Src_string)返回Src_string长度的整数(空字符’\0’不计算在内)
strcmp(String_1, String_2)如果两个字符串相等,就返回0如果相等,会返回0,它会转换成false。注意这可能与你想象的相反。

如果需要检查Target_string中最大可存储的容量,可以使用例如strcpy_s,后面带_s的函数。

标准string类

getline成员函数

有两个版本

1
2
istream& getline(istream& ins, string& strVar, char delimiter);
istream& getline(istream& ins, string& strVar);

第一个版本允许你自定义定界符,第二个版本默认定界符为’\n’

注意,混用cin和getline的时候需要注意,cin会把’\n’给getline,导致getline读到空字符串。

成员函数

示例说明
元素访问
str[i]
str.at(i)

str.substr(position, length)
str,length()

返回对索引i处的引用,不检查非法索引
和上面一样,但是这个版本会检查非法索引
返回调用对象的一个子字符串,从position开始,含有length个字符
返回长度
赋值/修改
str.empty()
str.insert(pos, str2)
str.erase(pos, length)

如果str为空字符串,就返回true,否则返回false
在str的pos处插入str2
删除长度为length的子字符串,从pos处开始
查找
str.find(str1)

str.find(str1, pos)
str.find_first_of(str1, pos)
str.find_first_not_of(str1, pos)

返回str1在str中首次出现的索引。如果str1没找到,返回特殊值string::npos
返回str1在str中首次出现的索引,从pos出开始查找
返回str1的任何字符在str中首次出现的索引,从pos处开始查找
返回不属于str1的任何字符在str中首次出现的索引,从pos处开始查找

小细节

赋值操作不适应于C字符串,所以下面这个看似合法的语句其实是非法的。

1
aCString = stringVariable.c_str();  //非法

字符串转换

C++11下的函数(C++11前滚)
转化到数字
stof(不会吧还有人用float),stod,stoi,stol
各种奇怪的类型转换为字符串
to_string

向量

最喜欢的功能之一,必须拥有名字,安排上。
可以自动扩充还一下子就知道长度的高级数组谁不喜欢呢

第9章 指针和动态数组

基本内存管理

new完了记得要delete。
另外delete之后的虚悬指针记得要指向nullptr。


《C++入门经典(第10版)》学习笔记
https://tokisaki.top/blog/c-study-notes/
作者
Tokisaki Galaxy
发布于
2021年3月13日
许可协议