两万字总结《C++ Primer》要点,附中英文版下载

2021 年 5 月 7 日 专知
转载机器之心
来源:Jacen的技术笔记
者:Jacen

对于想要入门C++的同学来说,《C++ Primer》是一本不能错过的入门书籍,它用平易近人的实例化教学激发学生的学习兴趣,帮助学生一步步走进C++的大门。在本文中,作者Jacen用两万多字总结了《C++ Primer 中文版(第五版)》1-16章的阅读要点,可以作为该书的阅读参考。注:原书更为详细,本文仅作学习交流使用。

第一章 开始

1.1 编写一个简单的C++程序

int main()
{
return 0;
}

每个C++程序都包含一个或多个函数,其中一个必须命名为main.

1.2 初识输入输出

对象 用途
cin
标准输入
cout
标准输出
cerr
标准错误
clog
输出运行时的一般性消息

1.3 注释简介

两种:
单行注释://
界定符:/* 和 */

1.4 控制流

while;for;if;

第二章 变量和基本类型

P30-P71
数据类型是程序的基础。C++语言支持广泛的数据类型。

基本内置类型

1.算术类型

类型 最小尺寸
bool
未定义
char
8位
w_char_t
16位
char16_t
16位
char32_t
32位
short
16位
int
16位
long
32位
long long
64位
float
6位有效数字
double
10位有效数字
long double
10位有效数字

2.类型转换

不要混用符号类型和无符号类型。

变量

1.变量定义

(1)基本形式:
类型说明符,随后紧跟着一个或者多个变量名组成的列表,其中变量名以逗号分隔,最后以分号结束。
(2)初始值
在C++中,初始化和赋值是2个完全不同的操作。初始化的含义是创建变量的时候赋予一个初始值,而赋值的含义是把对象的当前值擦除,用一个新值来替代。两者区别很小。
(3)列表初始化
用花括号来初始化变量的方式,称为列表初始化。
(4)默认初始化
如果定义变量没有指定初始值,则变量被默认初始化。
::: tip
例外情况:
定义在函数体内部的内置类型变量将不被初始化,其值未定义。
建议初始化每个内置类型的变量。:::


2.变量声明和定义的关系

变量声明:规定了变量的类型和名字。
变量定义:除声明之外,还需要申请存储空间。
如果想声明一个变量,而非定义它,需要使用extern关键词。
  
  
    
extern int i;    // 声明i而非定义i
int j;           // 声明并定义j
::: tip变量只能被定义一次,但可以被多次声明。:::


3.名字的作用域

作用域:C++中大多数作用域都用花括号分隔。
作用域中一旦声明了某个名字,它所嵌套的所有作用域都能访问该名字。同时,允许在内层作用域中重新定义外层作用域中有的名字。
::: warning如果函数有可能用到某全局变量,则不宜再定义一个同名的局部变量。:::


复合类型

定义:复合类型是基于其他类型定义的类型。


1.引用

引用:为对象起另外一个名字。
::: warning引用必须被初始化。引用本身不是对象,所以不能定义引用的引用。引用要和绑定的对象严格匹配。引用类型的初始值,必须是一个对象。:::


2.指针

指针:本身就是一个对象。允许对指针赋值和拷贝。指针无须在定义的时候赋值。
(1)利用指针访问对象
如果指针指向了一个对象,则允许使用解引用符(*)来访问该对象。
(2)void* 指针


3.理解复合类型的声明

(1)指向指针的指针
** 表示指向指针的指针
*** 表示指向指针的指针的指针
(2)指向指针的引用
不能定义指向引用的指针。但指针是对象,所以存在对指针的引用。

const限定符

定义:const用于定义一个变量,它的值不能被改变。const对象必须初始化。
::: tip
默认状态下,const对象仅在文件内有效。当多个文件出现了同名的const变量时,等同于在不同文件中分别定义了独立的变量。
如果想让const变量在文件间共享,则使用extern修饰。
:::
(1)const的引用
允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式。
一般,引用的类型必须与其所引用对象的类型一致,特殊情况是表达式。
(2)指针和const
弄清楚类型,可以从右边往左边阅读。
(3)顶层const
top-level const 表示指针本身是个常量
low-level const表示指针所指的对象是一个常量。
(4)constexpr和常量表达式
C++新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。

处理类型

类型别名

两种方法用于定义类型别名:
(1)使用关键词typedef
  
  
    
typedef double wages; //wages是double的同义词
typedef wages *p; // p是double*的同义词
(2)别名声明
  
  
    
using SI = Sales_item;  // SI是Sales_item的同义词
auto类型说明符:让编译器通过初始值来推算变量的类型。
decltype类型指示符:选择并返回操作符的数据类型。只得到类型,不实际计算表达式的值。

自定义数据结构

(1)类
数据结构是把一组相关的数据元素组织起来,然后使用它们的策略和方法。
类一般不定义在函数体内,为了确保各个文件中类的定义一致,类通常被定义在头文件中,而且类所在头文件的名字应该与类的名字一样。
头文件通常包含那些被定义一次的实体。
(2)预处理器
  
  
    
#ifndef SALES_DATA_H
#define SALES_DATA_H
#endif
一般把预处理变量的名字全部大写。

术语

空指针 :值为0的指针,空指针合法但是不指向任何对象。nullPtr是表示空指针的字面值常量。
void*:可以指向任意非常量的指针类型,不能执行解引用操作。

第三章 字符串、向量和数组

P74-P118
string表示可变长的字符序列,vector存放的是某种给定类型对象的可变长序列。

命名空间的 using 声明

  
  
    
using namespace:name;
头文件不应包含using声明。

标准库类型 string

  
  
    
#include <string>
using namespace std;
(1)定义和初始化
  
  
    
string s1;
sting s2(s1);
string s3("value");
string s3 = "value";
string s4(n, 'c');
(2)string对象的操作
  
  
    
s.empty(); // 判空
s.size(); // 字符个数
s[n]; // s中第n个字符的引用
s1+s2; // s1和s2连接
<,<=,>,>= // 比较
::: warning
标准局允许把字面值和字符串字面值转换成string对象。字面值和string是不同的类型。
:::
(3)处理string对象中的字符
::: tipC++程序的头文件应该使用cname,而不应该使用name.h的形式:::
遍历给定序列中的每个值执行某种操作
  
  
    
for (declaration : expression)
statement

标准库类型 vector

标准库vector表示对象的集合,其中所有对象的类型都相同。
vector是一个类模板,而不是类型。
(1)定义和初始化vector对象
  
  
    
vector<T> v1;
vector<T> v2(v1);
vector<T> v2 = v1;
vector<T> v3(n, val);
vector<T> v4(n);
vector<T> v5{a,b,c...}
vecrot<T> v5={a,b,c...}
如果用圆括号,那么提供的值是用来构造vector对象的。
如果用花括号,则是使用列表初始化该vector对象。
(2)向vector对象添加元素
先定义一个空的vector对象,在运行的时候使用push_back向其中添加具体指。
(3)其他vector操作
  
  
    
v.empty();
v.size();
v.push_back(t);
v[n];
::: warning
只能对确认已存在的元素执行下标操作。
:::

迭代器介绍

迭代器运算符
  
  
    
*iter // 解引用,返回引用
iter->mem // 等价于 (*iter).mem
++iter
--iter
iter1 == iter2
iter1 != iter2
iter + n
iter - n
iter += n
iter -= n
iter1 - iter2 // 两个迭代器相减的结果是它们之间的距离
>, >=, <, <= // 位置比较
::: warning
凡是使用了迭代器的循环体,都不能向迭代器所属的容器添加元素。
:::

数组

(1)数组、指针
使用数组下标的时候,通常将其定义为size_t类型。
::: warning
定义数组必须指定数组的类型,不允许用auto推断。
不存在引用的数组。
如果两个指针分别指向不相关的对象,则不能进行对这2个指针进行比较。
:::

多维数组

多维数组实际上是数组的数组。
  
  
    
size_t cnt = 0;
for(auto &row : a)
for (auto &col : row){
col = cnt;
++cnt;
}
  
  
    
int *ip[4]; // 整型指针的数组
int (*ip)[4]; // 指向含有4个整数的数组

术语

begin string和vector的成员,返回指向第一个元素的迭代器。也是一个标准库函数,输入一个数组,返回指向该数组首元素的指针。
end string和vector的成员,返回一个尾后迭代器。也是一个标准库函数,输入一个数组,返回指向该数组尾元素的下一个位置的指针。

参考链接:
https://mp.weixin.qq.com/s/b5w0qo02Z9HNGrakUCEnXQ

便捷下载,请关注专知公众号(点击上方蓝色专知关注)

  • 后台回复“CPP” 就可以获取《C++ Primer》中文版英文版》电子书专知下载链接

专知,专业可信的人工智能知识分发,让认知协作更快更好!欢迎注册登录专知www.zhuanzhi.ai,获取5000+AI主题干货知识资料!
欢迎微信扫一扫加入专知人工智能知识星球群,获取最新AI专业干货知识教程资料和与专家交流咨询
点击“ 阅读原文 ”,了解使用 专知 ,查看获取5000+AI主题知识资源
登录查看更多
1

相关内容

【干货书】Python参考手册,210页pdf
专知会员服务
63+阅读 · 2021年4月30日
【干货书】C++实战编程指南,附549页pdf与Slides
专知会员服务
82+阅读 · 2021年4月23日
专知会员服务
155+阅读 · 2021年3月6日
专知会员服务
98+阅读 · 2020年12月19日
Effective.Modern.C++ 中英文版,334页pdf
专知会员服务
67+阅读 · 2020年11月4日
【2020新书】现代C++初学者指南,301页pdf
专知会员服务
159+阅读 · 2020年7月24日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
87+阅读 · 2019年11月25日
82页《现代C++教程》:高速上手C++ 11/14/17/20
专知
20+阅读 · 2020年10月19日
PySpark和大数据处理初探
Python程序员
7+阅读 · 2019年10月10日
百闻不如一码!手把手教你用Python搭一个Transformer
大数据文摘
18+阅读 · 2019年4月22日
Python用于NLP :处理文本和PDF文件
Python程序员
4+阅读 · 2019年3月27日
推荐 | 机器学习经典总结,入门必读【17000字,可下载PDF】
机器学习算法与Python学习
16+阅读 · 2017年12月8日
python数据分析师面试题选
数据挖掘入门与实战
6+阅读 · 2017年11月21日
学员笔记||Python数据分析之:numpy入门(一)
七月在线实验室
7+阅读 · 2017年9月28日
Arxiv
0+阅读 · 2021年6月22日
Arxiv
15+阅读 · 2019年9月30日
Arxiv
15+阅读 · 2019年9月11日
VIP会员
相关VIP内容
【干货书】Python参考手册,210页pdf
专知会员服务
63+阅读 · 2021年4月30日
【干货书】C++实战编程指南,附549页pdf与Slides
专知会员服务
82+阅读 · 2021年4月23日
专知会员服务
155+阅读 · 2021年3月6日
专知会员服务
98+阅读 · 2020年12月19日
Effective.Modern.C++ 中英文版,334页pdf
专知会员服务
67+阅读 · 2020年11月4日
【2020新书】现代C++初学者指南,301页pdf
专知会员服务
159+阅读 · 2020年7月24日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
87+阅读 · 2019年11月25日
相关资讯
82页《现代C++教程》:高速上手C++ 11/14/17/20
专知
20+阅读 · 2020年10月19日
PySpark和大数据处理初探
Python程序员
7+阅读 · 2019年10月10日
百闻不如一码!手把手教你用Python搭一个Transformer
大数据文摘
18+阅读 · 2019年4月22日
Python用于NLP :处理文本和PDF文件
Python程序员
4+阅读 · 2019年3月27日
推荐 | 机器学习经典总结,入门必读【17000字,可下载PDF】
机器学习算法与Python学习
16+阅读 · 2017年12月8日
python数据分析师面试题选
数据挖掘入门与实战
6+阅读 · 2017年11月21日
学员笔记||Python数据分析之:numpy入门(一)
七月在线实验室
7+阅读 · 2017年9月28日
相关论文
Top
微信扫码咨询专知VIP会员