「C++程序设计 (面向对象进阶)」学习笔记・二

0、引言

本专栏的系列文章是在学习 北京邮电大学 崔毅东 老师的《C++程序设计 (面向对象进阶)》课程过程中整理的。欢迎前往专栏了解更多相关内容~ 😀

有关于现代 C++ 的基本介绍,请前往《现代C++基本介绍》!

🔔 先决条件

本专栏的系列文章并不适合从未接触过编程的同学,读者需要确保自己已经具备编程基础(特别是 C++ 基础)!您可以参考笔者的「面向对象程序设计(基础)」专栏了解 C++ 基础的相关内容。

1、C++ 源文件与编码规范

1.1、代码文件分类

与 C 语言类似,C++ 的代码文件同样分为两类:

  1. Header file 头文件
  2. Source file 源文件
CC++
hello.h
hello.c
hello.h
hello.hpp
hello.cpp
hello.cxx

红色标注指的是在一些其他环境中(比如 Linux),后缀名可能会如红色标注所示。

1.2、C++ 编码规范

📌 Why Coding Conventions

为了让程序具备更好的可读性,避免程序难以维护


Google
Google 开源项目风格指南
英文原版
中文版
其中 C++ 规范 5 万多字,过于庞大

GeoSoft
geosoft.no 编码风格指南
英文原版
只有英文版,但要相对简明一点
4.9 版本有 94 条规则

在后续的学习中,我们会逐步了解其中一些编码规范


1.3、回望第一个 C++ 程序

在基础阶段我们编写自己的第一个 C++ 程序是一个控制台打印 “Hello World!” 的程序,它的代码如下:

#include <iostream>
using namespace std;int main() {cout << "Hello World!" << endl;    return 0;
}

基于这个最简单的 C++ 程序,其实也包含了一些编码规范:

📃 38. Special characters like TAB and page break must be avoided.
📃 38. 必须避免使用“制表”和“分页”等特殊字符

因此,在 IDE 中,将“制表符”设置并替换为 4 个空格,可达到同样的缩进效果

📃 68. Functions must always have the return value explicitly listed.
📃 68. 函数必须总是将返回值明确列出

在 C++ 中,(只有)返回类型为 int 的函数允许不包含 return 语句,并且不会导致编译错误。此时函数会默认返回一个未定义的值,但这不是一种良好的实践

此外,在这个程序中,我们使用 #include <iostream> 包含了一个头文件。与 C 语言不同,早在 C++98 的时候,包含头文件就没有 .h 后缀了,通常只是包含文件的名称。

1.4、C++ 代码注释

在 C++ 中,可以添加多种注释:

行尾注释
在代码行的末尾添加注释。这些注释从代码的末尾延伸到行尾
int a = 20;  //这是一个行尾注释

单行注释
以双斜杠 // 开始,知道行尾的内容都被视为注释
//这是一个单行注释
int a = 20;

多行注释
/* 开始,以 */ 结束,中间的内容都被视为注释。多行注释可以跨越多行代码
/* 这是一个多行注释 */
int a = 20;

文档注释 (Doxygen 风格)
通常用于生成文档。以 /** 开头,以 */ 结束,可以包含与函数、类、变量等相关的说明文本
/*** @brief 函数说明* @param x 参数 x 的说明* @return 返回值的说明*/
int myFunction(int x){//函数体return x * 2;
}

1.5、Visual Studio 将当前选中项目设置为启动项目

参考 MSDN 运行 C# 项目的介绍
或者
崔毅东老师的教学视频(🧭 第2单元 第02节 2.2演示)

1.6、Visual Studio 设置多个启动项目

参考 MSDN 中的相关介绍

1.7、Visual Studio 对项目进行分组管理

Visual Studio 的解决方案资源管理器支持通过创建“解决方案文件夹”(也称为“解决方案筛选器”)的方式对项目进行分组管理。具体操作可以参考崔毅东老师的教学视频(🧭 第2单元 第02节 2.3演示)

有关“解决方案文件夹”的注意事项

2、命名空间/名字空间 NameSpace

NameSpace
中文译作“ 命名空间”或者“ 名字空间”;比如 std::cout 中的 std 就是命名空间。命名空间是一个声明性区域,为其内部的标识符(类型、函数和变量等的名称)提供一个范围。
using 指令
通过 using 指令,可使用 namespace 中的所有名称,而不需要 namespace-name 为显式限定符。比如我们在 1.3 小节的代码演示。

📌 using namespace std

在 C++ 编程中,通常不推荐直接使用 using namespace std;,而是更倾向于明确指定命名空间中的标识符,或者使用特定的 using 语句,如 using std::cout;using std::cin;。这是因为 using namespace std; 会引入整个 std 命名空间中的所有标识符,可能会导致一些问题和不必要的冲突:

  1. 命名冲突:std 命名空间中可能包含与您的程序中的其他命名空间或您自己的代码中的标识符冲突的名称。这可能导致编译错误或不明确的行为。
  2. 可读性和维护性:使用 using namespace std; 可能会使代码更难以阅读和维护,因为您无法轻松地确定来自哪个命名空间的特定标识符。
  3. 潜在的性能问题:引入整个 std 命名空间中的标识符可能会导致编译器需要更多的时间来查找标识符的定义,尤其在大型项目中。

更推荐的做法是使用特定的 using 语句,以引入需要的标识符,例如:

#include <iostream>using std::cout;
using std::endl;int main() {cout << "Hello World!" << endl;return 0;
}

3、编译 C++ 程序的步骤

如下所示流程图展示了创建并编译 C++ 程序的一般步骤:

CreatingAndCompilingPrograms

Precompile
预处理/ 预编译,主要做一些代码文本的替换工作
Compile
编译,将源代码生成机器码 Object file (目标文件), 例如 "Welcome.obj" (Windows 平台)
Link
链接,将目标文件和外部库链接为一个可执行文件,例如 "Welcome.exe" (Windows 平台)

4、处理错误

Error Classification 错误分类
  • Syntax Error 语法错误
  • Runtime Error 运行时错误
  • Logic Error 逻辑错误
语法错误
  • 违反了编程语言的语句形式或使用规则,一般由编译器检查指出。
  • 例如:遗漏标点符号、错用关键字、分支/循环语句结构缺失等
  • 有时也称为“编译错误”
运行时错误
  • 程序运行时,遇到一个无法执行的操作,一般编译器无法检查指出。
  • 例如:执行整数除以 0 的操作、打开不存在的文件、内存不足、磁盘满等
逻辑错误
  • 程序的运行结果与预期的正确结果不一致,编译器无法检查指出。
  • 例如:将 10 个整数排序输出的结果是由小到大,但是预期结果是由大到小

📌 常见的语法错误

  • 写错关键字;
  • 遗漏分号;
  • 遗漏大/中/小括号;
  • 遗漏引号等;
#includ <iostream>      //写错关键字
using namespace std     //遗漏分号//函数名写错
int mian() {            cout << "Hello World!" << endl;  cin.get);   //遗漏小括号return 0;
//遗漏大括号

4.1、与 namespace 有关的错误

  1. 未使用 using 语句而直接使用命名空间下的标识符,将会导致“未定义的标识符”错误。
  2. 我们可以声明自己的命名空间和命名空间成员,参考 MSDN。但需要注意的是,我们不能将 main 函数也包含在自己声明的命名空间当中,这样会导致“无法找到应用程序的主入口点”(参考 StackOverflow 了解更多)。

5、输入与输出

输入输出分类(根据源目分类):

  • Standard I/O(标准 IO):从键盘输入信息,在屏幕上显示信息;
  • File I/O(文件 IO):从文件中读信息,将信息写入到文件;
  • String I/O(字符串 IO):从字符串中读信息,将信息写入到字符串;
  • Network I/O(网络 IO):通过网络发送、接收信息;

作为初学者,我们通常最关注的是 标准输入输出

📌 C 和 Java 语言中的输入输出

Input 输入Output 输出
Cscanf()
getchar() / gets()
printf()
putchar() / puts()
JavaScanner 类
System.out.println() / print() / printf() / …

5.1、C++ 输入输出

C++ 使用一种称为 “” (stream) 的概念对屏幕、键盘或者文件进行输入输出操作

Stream 流Description 描述
cinstandard input stream 标准输入流
coutstandard output stream 标准输出流
cerrstandard error (output) stream
clogstandard logging (output) stream

📌 小知识

cincout 中的 c 指的是 “character”,而不是 C/C++。

Stream 流Operators 操作符Functions 函数
cin>>
含义
:extraction operator (流提取运算符)
cin.get() 从流中读并取走一个字符
cin.getline() 从流中读取字符,直至行尾或指定的分隔符
cin.ignore() 从流中读取并舍弃指定数量的字符
cout<<
含义
:insertion operator (流插入运算符)
cout.put() 将字符写到流中(无格式)
cout.flush() 将流中缓存内容全部输出

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

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

相关文章

定时器+BOM

9.定时器BOM 1.定时器 **概念:**重复执行一个函数 1.1setInterval() setInterval(“代码/函数”,时间,参数),返回定时器的序列号,默认从1开始 clearInterval(序列号)清除定时 <button class"start">开启定时器</button><button class"close…

通过Power Platform自定义D365 CE 业务需求 - 3. 使用Microsoft Power应用程序

Microsoft Power Apps是一个用于开发应用程序的无代码、无代码平台。Power应用程序可以在Dataverse之上配置为数据库。尽管您可以连接Salesforce、OneDrive、Dropbox等多种云源,但Dataverse也可以用作内部数据库来构建应用程序,并通过连接器连接其他数据源进行集成。 Power应…

Java开发之Redis核心内容【面试篇 完结版】

文章目录 前言一、redis使用场景1. 知识分布2. 缓存穿透① 问题引入② 举例说明③ 解决方案④ 实战面试 3. 缓存击穿① 问题引入② 举例说明③ 解决方案④ 实战面试 4. 缓存雪崩① 问题引入② 举例说明③ 解决方案④ 实战面试 5. 缓存-双写一致性① 问题引入② 举例说明③ 解决…

内存管理机制

aCoral内存管理机制 aCoral内存管理机制在伙伴系统基础上&#xff0c;采用了位图法方式提高内存分配和回收速度的确定性&#xff0c;更能满足系统实时性的需求。 aCoral内存管理机制分为两级&#xff0c;上一级采用改进的伙伴系统&#xff0c;负责确定要分配的内存的大小&…

数据分析综述

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

C#类与类库调用注意事项

类 创建一个类文件&#xff0c;myfunction.cs //静态类&#xff1a;直接引用、无需实例化 static public int jiafa(int V) //普通类&#xff1a;引用时需要实例化 public int jiafa(int V)using System; using System.Collections.Generic; using System.Diagnostics; using …

ChatGPT追祖寻宗:GPT-2论文要点解读

论文地址&#xff1a;Language Models are Unsupervised Multitask Learners 上篇&#xff1a;GPT-1论文要点解读 在上篇&#xff1a;GPT-1论文要点解读中我们介绍了GPT1论文中的相关要点内容&#xff0c;其实自GPT模型诞生以来&#xff0c;其核心模型架构基本没有太大的改变&a…

Vue中extend基本用法

1.Vue.extend(options) 参数: {Object} options用法&#xff1a; 使用基础Vue构造器&#xff0c;创建一个"子类"。参数是一个包含组件选项的对象。 data选项是特例&#xff0c;需要注意&#xff0c;在Vue.extend()中它必须是函数。 <html><head><tit…

读高性能MySQL(第4版)笔记08_创建高性能索引(上)

1. 索引 1.1. 键&#xff08;key&#xff09; 1.2. 存储引擎用于快速找到记录的一种数据结构 1.3. 当表中的数据量越来越大时&#xff0c;索引对性能的影响愈发重要 1.4. 在数据量较小且负载较低时&#xff0c;缺少合适的索引对性能的影响可能还不明显 1.5. 索引优化是对查…

C#__线程池的简单介绍和使用

/*线程池原理&#xff1a;&#xff08;有备无患的默认备用后台线程&#xff09;特点&#xff1a;线程提前建好在线程池;只能用于运行时间较短的线程。*/class Program{static void Main(string[] args){for (int i 0; i < 10; i){ThreadPool.QueueUserWorkItem(Download); …

【Redis】Redis作为缓存

【Redis】Redis常见面试题&#xff08;2&#xff09; 文章目录 【Redis】Redis常见面试题&#xff08;2&#xff09;1. 缓存2. Redis作为缓存2.1 缓存雪崩2.2 缓存穿透2.3 缓存击穿2.4 缓存雪崩、缓存穿透、缓存击穿的区别2.5 缓存预热2.6 如何保证缓存和MySQL双写一致 【Redis…

Java 设置免登录请求接口被拦截问题

1、在设置免登录时&#xff0c;前端将请求的路由添加到白名单后&#xff0c;请求接口还是被拦截到了&#xff0c;将请求接口也设置后还是会被拦截跳转到登录页面 通过JAVA 注解 Anonymous 进行设置匿名访问就可以了

【Unity编辑器扩展】| 自定义窗口和面板

前言【Unity编辑器扩展】| 自定义窗口和面板一、EditorWindow二、ScriptableWizard三、编辑器绘制3.1 文本输入3.2 空行3.3 滑动条、进度条3.4 枚举选择3.5 其他总结前言 前面我们介绍了Unity中编辑器扩展的一些基本概念及基础知识,还有编辑器扩展中用到的相关特性Attribute介…

华为云云耀云服务器L实例评测|服务器反挖矿防护指南

前言 本文为华为云云耀云服务器L实例测评文章&#xff0c;测评内容是 云耀云服务器L实例 反挖矿防护指南 系统配置&#xff1a;2核2G 3M CentOS7.9 之前的文章中『一文教你如何防御数据库恶意攻击』&#xff0c;我们讲到黑客如何通过攻击数据库来获取权限&#xff0c;以及我们…

pyarmor 加密许可证的使用

一 pyarmor 许可证的用处 文档&#xff1a;5. 许可模式和许可证 — Pyarmor 8.3.6 文档 试用版本有如下的限制&#xff1a; 加密功能对脚本大小有限制&#xff0c;不能加密超过限制的大脚本。 混淆字符串功能在试用版中无法使用。 RFT 加密模式&#xff0c;BCC 加密模式在试…

《确保安全:PostgreSQL安全配置与最佳实践》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

线性代数的本质(十)——矩阵分解

文章目录 矩阵分解LU分解QR分解特征值分解奇异值分解奇异值分解矩阵的基本子空间奇异值分解的性质矩阵的外积展开式 矩阵分解 矩阵的因式分解是把矩阵表示为多个矩阵的乘积&#xff0c;这种结构更便于理解和计算。 LU分解 设 A A A 是 m n m\times n mn 矩阵&#xff0c;…

【网络编程】深入理解TCP协议一(三次握手四次挥手、标记位、确认应答机制、超时重传机制)

TCP协议 1.三次握手四次挥手2.TCP协议段格式3.标记位介绍4.确认应答机制5.超时重传机制 1.三次握手四次挥手 当客户端发起连接请求时&#xff0c;SYN需要被设置位1&#xff0c;告诉服务器客户端希望建立一个链接服务器收到响应之后会回复 SYNACK&#xff0c;表示确认了客户端地…

利用Semaphore实现多线程调用接口A且限制接口A的每秒QPS为10

前段时间在群里面发现有个群友抛出一个实际需求&#xff1a;需要通过一个接口拉取数据&#xff0c;这个接口有每秒10QPS限制&#xff0c;请问如何实现数据拉去效率最大化且限制调用拉取接口每秒10PQPS&#xff1f;我觉得这个需求挺有意思的&#xff0c;跟某群友讨论&#xff0c…

莫比乌斯召回系统介绍

当前召回系统只能召回相关性高的广告&#xff0c;但不能保证该广告变现能力强。莫比乌斯做了如下两点创新&#xff1a; 在召回阶段&#xff0c;引入CPM等业务指标作为召回依据在召回阶段&#xff0c;引入CTR模型&#xff0c;从而召回更多相关性高且变现能力强的广告 参考 百度…