《C++ Primer Plus》《2、开始学习C++》
文章目录
- 0 前言:
- 1 进入C++
- 1.1 main()函数
- 1.2 C++注释
- 1.3 预处理器和iostream
- 1.4 头文件名
- 1.5 名称空间
- 1.6 使用cout进行C++输出
- 1.7 C++源代码的格式化
- 2 C++语句
- 2.1 声明语句和变量
- 2.2 赋值语句
- 2.3 cout语句
- 3 其他C++语句
- 3.1使用cin
- 3.2 使用cout进行拼接
- 3.3 类简介
- 4 函数
- 4.1 有返回值的函数
- 4.2 函数变体
- 4.3用户自定义的函数
- 4.4 用户定义有返回值的函数
- 4.5 使用using编译指令
- 5 总结
- 6 参考
0 前言:
基础知识是对C++特性,历史的一些介绍,并不涉及C++语言的实质。本章对C++语言的基本结构做一下概述,具体的细节,日后会一步步去完善。
1 进入C++
任何一句语言的初始,便是在界面上输出“Hello World!”,进而打开新世界的大门,感觉不对这个世界打声招呼,不好意思开始一样。C++也不例外。
#myfirst.cpp
#include<iostream>
int main(){
using namespace std;
cout <<"Hello World!";
cout << endl;
return 0;
}
之前学过C的会对这个程序既陌生又熟悉,下面来对myfirst.cpp程序的元素进行分析:
1)注释//;
2)预处理编译指令#include;
3)主函数int main();
4)编译指令 using namespace;
5)函数体的部分用{}包围;
6)用cout 显示消息语句;
7)用return 语句终结函数。
1.1 main()函数
myfirst.cpp的程序框架如图:
int main(){
statements;
return 0;
}
最早在学习C语言的时候,就一直在main()函数里面捣腾,所以对main语言,再熟悉不过。int main()叫函数头,{}括起来的部分叫作函数体,在C++中,每条完整的指令都成为语句,用分号来结束。其中最后一条return 0语句叫作返回语句,用它来对函数进行终结。
对main()函数作如下说明:
1)为什么只能是main()函数:
而不是A函数,B函数,C函数。我的解释是:当程序只有一个函数时,这个函数必须只能是main()函数(规定的事,不照办不好使),在运行C++程序时,通常是从main()函数开始执行的,如果没有main(),程序是不完整的,也将无法进行编译。
2)int main代表了什么
来看一下main()的接口描述,该接口从int 开始,main()函数将返回一个整数值,即int规定了函数返回值的类型。int main是一种缩略的写法,完整的写法是int main(void)。
3)语句与分号
语句是要执行的操作,为了理解源代码,编译器需要知道语句如何进行起止。语句之间需要使用语句分隔符,在C++中,使用的是分号对语句进行分隔。
1.2 C++注释
写程序,必须要进行注释,不然无法让别人对你的程序进行理解。C++的注释方式沿袭了C。有两种注释方法。
1)//用来对行进行注释,无法跨行发生作用;
2)/* */的注释,可以跨行进行注释。
1.3 预处理器和iostream
在学习的初期,这样的两行代码基本成了标配:
#include<iostream>
using namespace std;
#include是一种预处理,将iostream中的内容加入到程序中来,程序不仅仅只是main就完全实现功能,需要在源代码编译之前替换或添加文本。
1.4 头文件名
像iostream这样的文件就叫作包含文件(也叫作头文件),C++编译器自带了很多头文件,每个头文件都支持一组特定的工具,让程序在实现功能的前提下轻装上阵。以前的C++头文件都有“.h”的后缀,新式的C++风格没有扩展名。
| 头文件类型 | 约定 | 示例 | 说明 |
|---|---|---|---|
| C++旧式风格 | 以.h结尾 | iostream.h | C++可用 |
| C旧式风格 | 以.h结尾 | math.h | C,C++可用 |
| C++新式风格 | 没有扩展名 | iostream | C++可用 |
| 转换后的C | 加上前缀c,没有扩展名 | cmath | C++可用 |
1.5 名称空间
using namespace std;叫作using编译指令,名称空间支持是C++的一个特性。举个例子:用两个已经封装好的产品,里面都包含了一个函数——walk(),编译器不知道这个函数该用哪个产品的,这时候便可以用名称空间来进行标定,比如A公司的函数,A::walk();若是B公司的,则用B::walk()来进行表示。这样程序就可以使用名称空间来区分不同的版本。
就好像是个百宝箱,但是要先using先声明一下,才可以使用。
1.6 使用cout进行C++输出
之前的“Hello world”程序,利用cout进行输出,双引号将字符串框起来,不用管里面是什么,计算机会对他进行输
出的处理。
cout <<"Hello World!";
cout << endl;
"<< "表示该语句将字符串发送给了cout,有一种很形象的说法,这个符号指出了信息流动的路径。从C++的概念上理解这个过程,输出是一个流,即从程序流出的一段字符串。cout对象属性包括一个插入运算符,他可以将右侧的信息插入到流中。与其说程序显示了一条消息,不如说他将一个字符串插入到了输出流中。
补充:
a.cout<<endl,endl被称为控制符,endl也是在iostream中定义的,
b.C语言中的换行符是”\n”,\n叫作换行符,在C++也能使用。
1.7 C++源代码的格式化
- 1)源代码中的标记与空白
a.在一行代码中不可分割的元素叫作标记;
b.空格,制表符,回车统称为空白;
字符与字符之前需要添加一些空白,适当的空白使得程序可读性更强;不合时宜的空白会使得程序报错。
- 2)C++源代码的风格
为了提升自己的编码水平,首先需要输入一些“代码是非观“知道哪些是好的,高水平的代码。如下是编程需要遵循的一些原则。
a.一条语句占据一行,不要一条语句占据多行;
b.每个函数都有{},这两个花括号各占一行;
c.为了条理清晰,函数中的语句相对于花括号需要进行缩进;
d.与函数名称相关的圆括号周围没有空白。
2 C++语句
书中给出了carrots.cpp的示例代码。
2.1 声明语句和变量
声明语句,即你在用这个变量的时候,需要确定这个变量是哪种数据类型,以及它自身的变量名称。原则是:使用这个变量前需要先对其进行声明。
2.2 赋值语句
声明这个变量还不够,需要对其进行赋值,才能知道这个变量的具体数值,否则只会是一个没有意义的随机数。“=“是赋值语句。
2.3 cout语句
cout不仅可以打印字符串,也可以打印出变量的值,而不用对变量的数值类型做声明,我觉得这是C++比C更智能的地方。
3 其他C++语句
3.1使用cin
cin是与cout相对应的概念,cout是将字符串插入到数据流中,相对应的,cin是使用运算符>>从输入流中抽取字符。
3.2 使用cout进行拼接
C++的自由格式,将标记间的换行符和空格看作是可以相互替换的。
cout<<"Hello"<<"world";等价于
cout <<"Hello"
<<"world";
3.3 类简介
类是用户定义的一种数据类型,需要描述它能够表示什么信息,以及可对数据执行哪些操作,后续会详细讲解。
4 函数
程序的实现依赖于函数,所以有必要加深对函数的理解。
4.1 有返回值的函数
顾名思义,这个函数带有一个返回值,而调用这个函数的程序将会获得这个返回值。书中以sqrt()举例,说明调用函数后的具体流程。
4.2 函数变体
2.4.1的sqrt()函数,中规中矩,它既有输入的参数,也拥有返回值。但是函数的参数,可以没有,可以有1个,也可以有很多个,这都是允许的。至于返回值,函数可以有返回值,也可以没有返回值,只是完成相应操作即可。
4.3用户自定义的函数
从图像中可以看出,首先包含了头文件,使用了using编译指令,在main()函数之前声明了函数原型,然后在写函数的实现方式,最后main()函数在实现的过程中调用自定义的函数,过程大抵如此。
4.4 用户定义有返回值的函数
一个函数的特性:
1)有函数头和函数体
2)接受一个参数
3)返回一个值
4)需要一个原型(声明一个原型)
在对传入的参数,做一定的处理之后,return 即可。
4.5 使用using编译指令
在初期需要用到cin,cout,endl,这些都需要先using std的名称空间,当然这是偷懒的做法。例如在头函数包含下,添加语句using namespace std后便可以直接使用cin,cout,endl;若是不添加的话,需要这样表示——
std::cin>>
std::cout<<
std::endl.
5 总结
这一章通过“HelloWorld.cpp”敲开了C++的大门,了解了预编译处理器,头文件,using编译指令,main函数,其他功能函数,以及C++的6种语句,cin,cout,C++的学习之路刚刚开始。
6 参考
《C++ Primer Plus》
相关文章:
《C++ Primer Plus》《2、开始学习C++》
文章目录 0 前言:1 进入C1.1 main()函数1.2 C注释1.3 预处理器和iostream1.4 头文件名1.5 名称空间1.6 使用cout进行C输出1.7 C源代码的格式化 2 C语句2.1 声明语句和变量2.2 赋值语句2.3 cout语句 3 其他C语句3.1使用cin3.2 使用cout进行拼接3.3 类简介 4 函数4.1 …...
Backtrader 文档学习- Sizers
Backtrader 文档学习- Sizers 1.概述 智能仓位 Strategy提供了交易方法,即:buy,sell和close。看一下buy的定义: def buy(self, dataNone,sizeNone, priceNone, plimitNone,exectypeNone, validNone, tradeid0, **kwargs):注意&…...
基于YOLOv8算法的照片角度分类项目实践
目录 一、任务概述二、YOLOv8算法简介2.1 算法改进2.2 算法特点2.3 网络结构2.4 性能比较 三、工程实践3.1 安装算法框架库ultralytics3.2 库存照片预处理3.2.1 提取所有图片3.2.2 去除冗余的相同照片3.2.3 去除无车辆照片3.2.4 随机提取指定数量的图片 3.3 照片朝向分类3.3.1 …...
go语言进阶篇——面向对象(一)
什么是面向对象 在我们设计代码时,比如写一个算法题或者写一个问题结局办法时,我们常常会使用面向过程的方式来书写代码,面向过程主要指的是以解决问题为中心,按照一步步具体的步骤来编写代码或者调用函数,他在问题规…...
C#,栅栏油漆算法(Painting Fence Algorithm)的源代码
1 刷油漆问题 给定一个有n根柱子和k种颜色的围栏,找出油漆围栏的方法,使最多两个相邻的柱子具有相同的颜色。因为答案可以是大的,所以返回10^97的模。 计算结果: 2 栅栏油漆算法的源程序 using System; namespace Legalsoft.Tr…...
java_error_in_pycharm.hprof文件是什么?能删除吗?
java_error_in_pycharm.hprof文件是什么?能删除吗? 🌵文章目录🌵 🌳引言🌳🌳hprof格式文件介绍🌳🌳java_error_in_pycharm.hprof文件什么情况下能删除🌳&…...
LeetCode 491 递增序列
给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。 示例: 输入: [4, 6, 7, 7] 输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]说明: 给定数组的长度不会超过15。 数组中的整数范围是 [-…...
考研/计算机二级数据结构刷题之顺序表
目录 第一题 顺序表的初始化,销毁,头插,尾插,头删,尾删,指定位置插入,指定删除以及打印 第二题 移除元素 题目链接: OJ链接 题目详解:移除元素 第三题:删…...
Git 代码协同的使用方法 for Azure DevOps
1. 登陆Azure 步骤1.1. VS Code,登陆Azure Cloud的Ubuntu环境,如下: 重点: 这里的Azure Cloud的用户名是YourAzureUserName,口令是YourAzurePassword 步骤1.2. 登陆Azure Cloud的Ubuntu环境后,配置Git账户信息&…...
数据库学习笔记2024/2/5
2. SQL 全称 Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了 一套操作关系型数据库统一标准 2.1 SQL通用语法 在学习具体的SQL语句之前,先来了解一下SQL语言的通用语法。 1). SQL语句可以单行或多行书写&…...
PSM-Net根据Stereo图像生成depth图像
一、新建文件夹 在KITTI数据集下新建depth_0目录 二、激活anaconda环境 conda activate pt14py37三、修改submission.py文件 3.1 KITTI数据集路径 parser.add_argument(--datapath, default/home/njust/KITTI_DataSet/00/, helpselect model)3.2 深度图像输出路径 save…...
Mocaverse NFT 概览与数据分析
作者:stellafootprint.network 编译:mingfootprint.network 数据源:Mocaverse NFT Collection Dashboard Mocaverse 是 Animoca Brands 推出的专属 NFT(非同质化代币)系列,包含 8,888 个独特的 "M…...
SpringBoot之事务源码解析
首先事务是基于aop的,如果不了解aop的,建议先去看下我关于aop的文章: Spring之aop源码解析 先说结论,带着结论看源码。首先,在bean的生命周期中, 执行实例化前置增强,会加载所有切面并放入缓存࿰…...
FPGA高端项目:解码索尼IMX327 MIPI相机转USB3.0 UVC 输出,提供FPGA开发板+2套工程源码+技术支持
目录 1、前言免责声明 2、相关方案推荐我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理图像缓存UVC 时序USB3.0输出架构FPGA逻辑设计工程源码架构SDK软件工程源…...
基于高通滤波器的ECG信号滤波及心率统计matlab仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 ECG信号简介 4.2 高通滤波器原理 4.3 心率统计 5.完整工程文件 1.课题概述 通过高通滤波器对ECG信号进行滤波,然后再统计其心率。 2.系统仿真结果 3.核心程序与模型 版本:…...
springCould中的gateway-从小白开始【9】
目录 1.🍟网关是什么 2.🍿gateway是什么 3.🥚gateway能什么 4.🌭核心概念 5.🧂工作流程 6.🧈实例 7.🥓gateway网关配置的方式 8.🍳配置动态路由 9.🧇pred…...
邮箱营销软件推荐?企业邮箱群发会限制吗?
邮箱营销平台怎么选择?哪种邮箱适合做外贸邮件群发? 邮箱营销凭借其精准触达、低成本和高回报的特点,依然是许多企业不可或缺的营销手段。该如何选择一款适合自己的工具呢?蜂邮EDM将为您推荐几款优秀的邮箱营销软件,并…...
编译原理实验3——自下而上的SLR1语法分析实现(包含画DFA转换图、建表、查表)
文章目录 实验目的实现流程定义DFA状态实现代码运行结果测试1测试2测试3 总结 实验目的 实现自下而上的SLR1语法分析,画出DFA图 实现流程 定义DFA状态 class DFA:def __init__(self, id_, item_, next_ids_):self.id_ id_ # 编号self.item_ item_ # productio…...
基于tomcat的https(ssl)双向认证
一、背景介绍 某个供应商服务需要部署到海外,如果海外多个地区需要部署多个服务,最好能实现统一登录,这样可以减轻用户的使用负担(不用记录一堆密码)。由于安全问题(可能会泄露用户数据)&#x…...
【iOS ARKit】3D人体姿态估计实例
与2D人体姿态检测一样,在ARKit 中,我们不必关心底层的人体骨骼关节点检测算法,也不必自己去调用这些算法,在运行使用 ARBodyTrackingConfiguration 配置的 ARSession 之后,基于摄像头图像的3D人体姿态估计任务也会启动…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
