C++Primer第五版【阅读笔记】

news2024/12/25 12:31:58

C++Primer第五版 阅读笔记

  • 第1章开始
    • 1.1 编写一个简单的C++程序
      • 1.1.1 编译、运行程序
    • 1.2 初识输入输出
    • 1.3 注释简介
    • 1.4 控制流
      • 1.4.1 while语句
      • 1.4.2 for语句
      • 1.4.3 读取数量不定的输入数据
      • 1.4.4 if语句
    • 1.5 类简介
      • 1.5.1 Sales_item 类
      • 1.5.2 初识成员函数
    • 1.6 书店程序
    • 第一章小结
  • 第2章 变量和基本类型
    • 2.1 基本内置类型
      • 算术类型
  • 第3章 字符串、向量、数组
  • 第10章 泛型算法
    • 10.1 概述
    • 10.2 初识泛型算法

第1章开始

学习一门新的程序设计语言的最好方法就是练习编写程序。

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

每个C++程序都包含一个或多个函数,其中一个必须命名为 main,操作系统通过调用 main 来运行C++程序。

一个函数定义包括:

  • 返回类型。
  • 函数名。
  • 形参列表。
  • 函数体:以 { 开始 ,以 } 结束的语句块。

main 函数的返回类型必须为 int。

return 语句包括一个值时,返回值类型必须与函数的返回类型相容。
类型相容:类型相同或能够进行隐式转换。

main 返回值被用来指示状态,0表示成功,非0的含义由系统定义,通常用来指出错误类型。

类型决定:

  • 内容。
  • 运算。
  • 内存空间。
  • 数据的意义。

1.1.1 编译、运行程序

常见源文件命名约定:.cc、.cxx、.cpp、.cp及.C。

操作系统 / 编译器编译运行访问 main 的返回值备注
UNIXCC prog1.cc 生成可执行文件 a.outa.out 或者 ./a.out(指出该文件在当前目录)echo $?
WindowsCC prog1.cc 生成可执行文件 prog1.exeprog1 或者 .\prog1(指出该文件在当前目录)$ echo %ERRORLEVEL%
GNUg++ -o prog1 prog1.cc 生成可执行文件 prog1./prog1(指出该文件在当前目录)-o 指定可执行文件的文件名。
UNIX生成 prog1
Windows生成 prog1.exe
省略 -o prog1 UNIX 系统生成 a.out 可执行文件。
Windows 系统生成 a.exe 可执行文件。
使用GNU编译器需要指定 -std=c++0x 参数来打开对C++11的支持。
Visual Studiocl /Ehsc prog1.cpp 自动生成可执行文件 prog1.exeprog1.\prog1.\prog1.exe(指出该文件在当前目录)命令 cl 调用编译器。
/Ehsc 是编译器选项,用来打开标准异常处理。
生成可执行文件名字与第一个源文件名对应,后缀为.exe。

GUN编译器选项 -Wall 使用说明:生成所有警告信息。

Visual Studio 编译器 /W4 使用说明:开启编译器 4级 警告信息。详细见 Microsoft C/C++ 编译器和生成工具错误与警告 官方文档。
点击此处进入:Microsoft C/C++ 编译器和生成工具错误与警告官方文档

1.2 初识输入输出

C / C++ 语言未定义任何输入输出语句,而是使用标准库提供IO机制(个人理解是为了修改、拓展和升级方便)。

iostream库包含:

  • 流输入类型:istream
  • 流输出类型:ostream

标准库定义的4个IO库:

  • 标准输入:cin
  • 标准输出:cout
  • 标准错误:cerr(输出警告和错误信息)
  • 输出程序运行时的一般性信息:clog(可以理解为常规日志输出)

每个使用标准库设施的程序都必须包含相关的头文件。
#include指令和头文件的名字必须写在同一 行中。
通常情况下,#include指令必须出现在所有函数之外。
一般将一个程序的所有#include指令都放在源文件的开始位置。

C++中,一个表达式产生一个计算结果。
表达式:一个或多个运算对象和(通常是)一个运算符组成。

cout 中使用的 << 运算符 和 cin 中使用的 >> 运算符均返回运算符左侧对象,使得cout 和 cin 支持链式操作。

字符串字面值常量:一对双引号包围的字符序列。

endl:

  • 操作符。
  • 结束当前行。
  • 刷新缓冲区。

注意:调试程序时添加打印语句应该保证一直刷新缓冲区,否则会出现程序崩溃时输出还留在缓冲区,影响程序崩溃位置的判断。

命名空间的作用:避免不经意的名字冲突。
标准库定义的所有名字都在命名空间 std 中。

命名空间的使用推荐:

  • 建议使用(不释放命名空间):std::cout<<"hello world"<<endl;
  • 可以使用(释放部分命名空间): using std::cout;
    cout<<"hello world"<<endl;
  • 尽量少用(释放整个命名空间):using std;
    cout<<"hello world"<<endl;

初始化:创建变量的同时赋值。

1.3 注释简介

错误的注释比完全没有注释更糟糕,因为它会误导读者。

C++注释种类:

  1. 单行注释://注释内容
  2. 多行注释:
    //注释内容
    //注释内容
    //注释内容
  3. 多行注释(注释界定符不能嵌套):/*注释内容*/

1.4 控制流

1.4.1 while语句

while(condition)
	statement

执行过程:
while循环
语句块:花括号包围的零条或多条语句的序列。任何要求使用语句的地方都可以使用语句块。

1.4.2 for语句

for(init-statement ; condition ; expression)
		statement

执行过程:
for语句

1.4.3 读取数量不定的输入数据

源码演示:

#include <iostream>

int main()
{
	int sum = 0, value = 0;
	while (std::cin >> value)
		sum += value;
	std::cout << "Sum is: " << sum << std::endl;
	return 0;
}

运行结果:
运行结果
istream 对象作为条件时,检测流状态。
如果有效,条件为真。
如果无效,条件为假。

条件为假:

  1. 遇到文件结束符。
  2. 遇到一个无效输入。

从键盘输入文件结束符:

  • Windows:Ctrl + Z 或 Ctrl + D , 然后按Enter。
  • UNIX(包括 Mac OS):Ctrl + D。

常见编译器可以检查出来的错误:

  • 语法错误。
  • 类型错误。
  • 声明错误(C++程序中的名字要求先声明后使用。)。

修改错误:

  1. 按照报告顺序逐个修正,单个错误常常具有传递效应。
  2. 每修正一个错误之后立即重新编译代码,保持周期:编辑 - 编译 -调试。

1.4.4 if语句

if(condition_1)
	statement_1
else if(condition_2)
	statement_2
	……
else if(condition_n)
	statement_n
	……
else
	statement_other

执行过程:
执行过程

注意:C++使用 = 赋值,使用 == 作为相等运算符。两个运算符都可以出现在条件中。
常见错误:想在条件中使用 == ,误用了 =

C++程序的缩进和格式:

  1. 不存在唯一正确的风格,但保持一致性非常重要。
  2. 思考风格对程序可读性和易理解性有什么影响,一旦选择了一种风格就要坚持使用。

1.5 类简介

C++中通过类定义自己的数据结构。
一个类定义了一个类型,以及与其关联的一组操作。
C++最初的一个设计焦点就是能定义使用上像内置类型一样自然的类类型。

使用头文件访问为自己应用程序所定义的类。
习惯上头文件根据定义类的名字来命名。
通常使用 .h 作为头文件后缀。

1.5.1 Sales_item 类

使用类时,不关心如何实现,只关心类对象可以执行什么操作。
每个类定义一个新的类型,类型名就是类名。

类的作者定义了类对象可以执行的所有动作。

包含来自标准库的头文件使用 <> 包围。
包含来自不属于标准库的头文件使用 " " 包围。

使用文件重定向:
大多数系统支持文件重定向,可以将标准输入输出与文件命名相关联:
todo

1.5.2 初识成员函数

成员函数:定义为类的一部分的函数,也被称为方法。
类对象使用点运算符 . 调用成员函数, . 运算符只能用于类类型的对象。

类对象 . 该类对象的成员名

运算结果为右侧运算对象指定的成员。

1.6 书店程序

第一章小结

  • 编译、运行简单的C++程序。
  • main函数相关。
  • 定义变量,输入输出。
  • if语句、for语句和while语句。
  • 类的特性,创建、使用类对象。

第2章 变量和基本类型

编程语言补充基本特性:

  1. 自定义数据类型。
  2. 提供标准库。

C++类对象决定能够进行的操作。
表达式是否合法依赖于其中参与运算的对象的类型(确定该类型是否支持该运算)。

C++类型检查发生在编译时,编译器必须知道程序中的每一个变量对应的数据类型。

C++新类型包含:

  • 数据成员。
  • 函数成员。

C++支持广泛的数据类型:

  • 基本内置类型。
  • 自定义数据类型。

2.1 基本内置类型

  • 算术类型:字符、整型数、布尔值、浮点数。
  • 空类型(void):不对应具体值,仅用于一些特殊场合。

算术类型

  1. 整型。
  2. 浮点型。

整型:

  • 字符。
  • 布尔类型。
  • 浮点型。

浮点型:

  1. 单精度。
  2. 双精度。

C++标准规定的类型尺寸的最小值:
C++标准规定的类型尺寸的最小值
布尔类型 (bool) 的取值为真(true)或 假 (false)。

基本字符类型:char。
char的空间确保可以存放机器基本字符集中任意字符对应的数字值。
一个char的大小和一个机器字节一样。

扩展字符集:wchar_t、char16_t、char32_t、wchar_t 类型确保可以存放机器最大扩展字符集中的任意字符。

C++规定:

  • 一个 int 至少和一个 short 一样大。
  • 一个 long 至少和一个 int 一样大。
  • 一个 long long(C++11中新定义的) 至少和一个 long一样大。

内置类型的机器实现:

第3章 字符串、向量、数组

第10章 泛型算法

独立于 容器类型元素类型 的通用算法。

10.1 概述

算法不直接操作容器,而是遍历两个迭代器指定的元素范围进行操作。

代码演示:在 vector 中查找元素。

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	int val = 5;
	vector<int> vi = { 1,2,2,2,2,3,4,5,6,6,7,8,9 };
	int array_i[] = { 1,2,2,2,2,3,4,5,6,6,7,8,9 };
	auto result1 = find(vi.begin(), vi.end(), val);
	cout << "The value1 " << val << (result1 == vi.end() ? " is no present" : " is present") << endl;

	auto result2 = find(vi.begin() + 1, vi.begin() + 4, val);
	cout << "The value2 " << val << (result2 == vi.end() ? " is no present" : " is present") << endl;

	auto result3 = find(begin(array_i), end(array_i), val);
	cout << "The value3 " << val << (result3 == end(array_i) ? " is no present" : " is present") << endl;

	auto result4 = find(begin(array_i) + 1, begin(array_i) + 6, val);
	cout << "The value4 " << val << (result4 == begin(array_i) + 6 ? " is no present" : " is present") << endl;

	val = 2;
	cout << count(vi.begin(), vi.end(), val) << endl;
	val = 6;
	cout << count(begin(array_i), end(array_i), val) << endl;

	return 0;
}


运行结果:todo

find 返回第一个等于给定元素的迭代器,搜索失败返回第二个参数。
可以用将上述 find 操作应用于所有容器中进行查找操作。

泛型算法:不会改变底层容器的大小,可能改变容器内元素值或在容器内移动元素,但永远不会添加和删除元素。

算法可以操作插入器迭代器进行底层容器的插入操作,但算法自身永远不会做这样的操作。todo

10.2 初识泛型算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/477268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux入门】linux指令(1)

【Linux入门】linux指令&#xff08;1&#xff09; 目录 【Linux入门】linux指令&#xff08;1&#xff09;操作系统登录服务器Linux下的基本指令ls指令pwd指令Linux路径分割符 /cd指令touch指令mkdir指令&#xff08;重要&#xff09;rmdir指令&&rm指令&#xff08;重…

4.30下周美联储携非农来袭黄金多空该如何布局?

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五(4月28日)当周金价维持震荡交投&#xff0c;金价基本持稳于2000美元下方。支撑和打压金价的因素参半。经济衰退的担忧&#xff0c;以及避险情绪支持金价&#x…

Fabric.js 讲解官方demo:Stickman

theme: smartblue 本文简介 戴尬猴&#xff0c;我是德育处主任 Fabric.js 官网有很多有趣的Demo&#xff0c;不仅可以帮助我们了解其功能&#xff0c;还可以为我们提供创意灵感。其中&#xff0c;Stickman是一个非常有趣的例子。 先看看效果图 从上图可以看出&#xff0c;在拖拽…

【SpringBoot2】二:基础入门---自动配置原理(SpringBoot特点+容器功能)

文章目录 1.SpringBoot特点1.1 依赖管理1.2 自动配置 2.容器功能2.1 组件添加2.1.1Configuration2.1.2 Bean、Component、Controller、Service、Repository2.1.3 ComponentScan、Import2.1.4 Conditional 2.2 原生配置引入ImportResource2.3 配置绑定2.3.1 Component Configur…

如何保障网络安全

网络安全是一个涵盖范围广、深入浅出的话题。随着互联网在现代社会中扮演的重要角色日益突出&#xff0c;网络安全问题成为各个领域所关注的焦点。在此&#xff0c;我们将从以下几个方面来阐述网络安全的重要性&#xff0c;并讨论几种保障网络安全的方式。 一、网络安全的重要性…

K8s(1.20.15版本)部署(3master+2node)

1.准备工作 准备五台centos 7的虚拟机&#xff08;每台虚拟机分配2核2G&#xff0c;存储使用20G硬盘&#xff0c;必须2核不然报错&#xff09;&#xff1a;如下图机器的分配情况&#xff1a; IP节点名称节点类型10.10.10.11k8s-master11master10.10.10.12k8s-master12master1…

解决centos8下域名raw.githubusercontent.com解析错误

在win10环境下执行命令 D:\test>ping raw.githubusercontent.com Ping 请求找不到主机 raw.githubusercontent.com。请检查该名称&#xff0c;然后重试。 解决很简单&#xff0c;把ipv6的DNS服务器设为240c::6666就行了&#xff0c;改完后执行命令 D:\test>ping raw.g…

C语言函数大全-- s 开头的函数(2)

C语言函数大全 本篇介绍C语言函数大全-- s 开头的函数&#xff08;2&#xff09; 1. setlinestyle 1.1 函数说明 函数声明函数功能void setlinestyle( int linestyle, unsigned upattern, int thickness );设置当前绘图窗口的线条样式、线型模式和线条宽度 参数&#xff1a…

SQL中去除重复数据的几种方法,我一次性都告你​

使用SQL对数据进行提取和分析时&#xff0c;我们经常会遇到数据重复的场景&#xff0c;需要我们对数据进行去重后分析。 以某电商公司的销售报表为例&#xff0c;常见的去重方法我们用到distinct 或者group by 语句&#xff0c; 今天介绍一种新的方法&#xff0c;利用窗口函数…

不得不说的行为型模式-命令模式

目录 命令模式&#xff1a; 代码实例&#xff1a; 下面是面试中可能遇到的问题&#xff1a; 命令模式&#xff1a; 命令模式(Command Pattern)是一种行为型设计模式&#xff0c;它允许将请求封装成对象&#xff0c;从而让你能够用不同的请求对客户端进行参数化&#xff0c;对…

Guitar Pro8苹果mac最新版本下载安装教程

Guitar Pro是一款专业的吉他制谱软件&#xff0c;现在已更新至Guitar Pro8&#xff0c;新增了支持添加音频轨道、支持嵌套连音符、直观的效果器视图、让指法一目了然的音阶示意图等实用新功能。下面我们来看Guitar Pro8 Mac如何安装。 guitar pro是一款专业的吉他学习软件&…

Linux内核(十四)Input 子系统详解 I —— 子系统介绍以及相关结构体解析

文章目录 概述input 子系统框架input 子系统相关结构体介绍input_dev结构体input_handler结构体input_handle结构体Evdev事件相关结构体input_event结构体&#xff08;标准按键编码信息&#xff09;设备相关信息结构体 概述 input子系统就是管理输入的子系统&#xff0c;和Lin…

HTML中的常用标签

HTML中的常用标签 &#x1f50e;注释标签&#x1f50e;标题标签&#x1f50e;段落标签&#x1f50e;换行标签&#x1f50e;格式化标签&#x1f50e;图片标签&#x1f50e;超链接标签&#x1f50e;表格标签合并单元格 &#x1f50e;列表标签无序列表有序列表自定义列表 &#x1…

新手如何快速学会Python?

在本文中&#xff0c;我们将介绍如何有效地学习 Python 。你应该知道「数据科学」是用于解决、探究问题并从数据中提取有价值信息的科学。 为了有效地做到这一点&#xff0c;你需要整理数据集、训练机器学习模型、可视化结果等等。 这是学习 Python 的最佳时机。 事实上&#x…

【五一创作】数据可视化之美 ( 三 ) - 动图展示 ( Python Matlab )

1 Introduction 在我们科研学习、工作生产中&#xff0c;将数据完美展现出来尤为重要。 数据可视化是以数据为视角&#xff0c;探索世界。我们真正想要的是 — 数据视觉&#xff0c;以数据为工具&#xff0c;以可视化为手段&#xff0c;目的是描述真实&#xff0c;探索世界。 …

[创新工具和方法论]-01- DOE课程基础知识

文章目录 1.DOE实验设计的介绍1.1 什么是实验设计DOE?1.2 DOE的优势有哪些?1.3 如何开展DoE研究&#xff1f;步骤 2.DOE实验培训3.数据分析步骤4.实验的随机化5.偏差6.R方 相关系数假设检验 7.三因子二水平全因子设计 1.DOE实验设计的介绍 实验设计是一种安排实验和分析实验数…

【网络进阶】服务器模型Reactor与Proactor

文章目录 1. Reactor模型2. Proactor模型3. 同步IO模拟Proactor模型 在高并发编程和网络连接的消息处理中&#xff0c;通常可分为两个阶段&#xff1a;等待消息就绪和消息处理。当使用默认的阻塞套接字时&#xff08;例如每个线程专门处理一个连接&#xff09;&#xff0c;这两…

Ubantu docker学习笔记(八)私有仓库

文章目录 一、建立HTTPS链接1.在仓库服务器上获取TLS证书1.1 生成证书颁发机构证书1.2 生成服务器证书1.3 利用证书运行仓库容器 2.让私有仓库支持HTTPS3.客户端端配置 二、基本身份验证三、对外隐藏仓库服务器3.1 在服务器端3.2 在客户端进行 四、仓库可视化 在前面的学习中&a…

数据库三范式与反范式详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;数据库三范式与反范式详解 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林…

阿里云服务器通用算力u1性能测评CPU处理器网络PPS

阿里云服务器u1通用算力型Universal实例高性价比&#xff0c;CPU采用Intel(R) Xeon(R) Platinum&#xff0c;主频是2.5 GHz&#xff0c;云服务器U1实例的基准vCPU算力与5代企业级实例持平&#xff0c;最高vCPU算力与6代企业级实例持平&#xff0c;提供2c-32c规格和1:1/2/4/8丰富…