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

news2025/1/12 15:44:03

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.coloradmin.cn/o/1016998.html

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

相关文章

【测试开发】答疑篇 · 什么是软件测试

【测试开发】答疑篇 文章目录 【测试开发】答疑篇1. 生活中的测试2. 什么是软件测试3. 为什么要有测试/没有测试行不行4. 软件测试和软件开发的区别5. 软件测试和软件调试之间的区别6. 软件测试的岗位7. 优秀测试人员具备的素质 【测试开发】答疑篇 软件不一定是桌面应用&#…

公众号迁移线上公证如何办?

公众号账号迁移的作用是什么&#xff1f;只能变更主体吗&#xff1f;微信公众平台的帐号迁移功能可将原公众号的粉丝、文章素材、违规记录、留言功能、名称等迁移至新的公众号。通过迁移可以实现公众号的公司主体变更、粉丝转移、开通留言功能、服务号转为订阅号等作用。因此不…

Qt基于paintEvent自定义CharView

Qt基于paintEvent自定义CharView 鼠标拖动&#xff0c;缩放&#xff0c;区域缩放&#xff0c; 针对x轴&#xff0c;直接上代码 charview.h #ifndef CHARVIEW_H #define CHARVIEW_H#include <QWidget> #include <QPainter> #include <QPaintEvent> #inclu…

Kotlin使用infix关键字构建高可读性代码

自从Google推出Kotlin作为官方开发语言后&#xff0c;一堆像我这样的习惯Java开发的程序员从不习惯到爱上这门语言只用了很短的时间&#xff0c;相比于Java语言&#xff0c;kotlin集各家所长&#xff0c;可以使用更少的代码&#xff0c;实现更多更复杂的需求&#xff0c;而且可…

腾讯mini项目-【指标监控服务重构】2023-08-18

今日已办 watermill 将 key 设置到 message 中 修改 watermill-kafka 源码 将 key 设置到 message.metadata中 接入 otel-sdk 添加 middleware resolveUpstreamCtx 解析上游上下文&#xff0c;开启根Span添加 middleware middleware.InstantAck - 马上ACK&#xff0c;使得多…

怒刷LeetCode的第4天(Java版)

#【中秋征文】程序人生&#xff0c;中秋共享# 目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;遍历字符串 方法二&#xff1a;有限状态机&#xff08;Finite State Machine&#xff09; 方法三&#xff1a;正则表达式 第二题 题目来源 题目内容 解决方…

机器学习——决策树/随机森林

0、前言&#xff1a; 决策树可以做分类也可以做回归&#xff0c;决策树容易过拟合决策树算法的基本原理是依据信息学熵的概念设计的&#xff08;Logistic回归和贝叶斯是基于概率论&#xff09;&#xff0c;熵最早起源于物理学&#xff0c;在信息学当中表示不确定性的度量&…

带你了解前后端分离的秘密-Vue【vue入门】

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Vue》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专栏…

js中事件委托和事件绑定之间的区别

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 事件绑定&#xff08;Event Binding&#xff09;⭐事件委托&#xff08;Event Delegation&#xff09;⭐ 选择事件绑定或事件委托⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本…

NVM安装及如何使用NVM

NVM是什么&#xff1f; nvm 全名 Node Version Manager&#xff0c;Node的版本管理工具 NVM能做什么&#xff1f; 安装 nvm 后&#xff0c;可以使用nvm的相关命令来管理和切换不同的 node 版本&#xff0c;方便开发 如何安装NVM 链接: NVM GitHub地址 如何使用 NVM 命令 …

R语言绘制PCA双标图

代码&#xff1a; setwd("D:/Desktop/0000/R") #更改路径#导入数据 df <- read.table("Input data.csv", header T, sep ",")# ----------------------------------- #所需的包: packages <- c("ggplot2", "tidyr"…

1.简单工厂模式

UML类图 代码 main.cpp #include <iostream> #include "OperationFactory.h" using namespace std;int main(void) {float num1;float num2;char operate;cin >> num1 >> num2 >> operate;Operation* oper OperationFactory::createOpera…

算法综合篇专题四:前缀和

"回忆里的我&#xff0c;比国王富有。奢侈的快乐~" 1、前缀和【模板】 (1) 题目解析 (2) 算法原理 #include <iostream> using namespace std;const int N 100010; // 可能出现溢出 long long arr[N],dp[N]; int n,q;int main() {cin >> n …

长胜证券:突破五日线什么意思?

随着股市的快速开展&#xff0c;越来越多的人开端了解和参与股票投资&#xff0c;但或许会遇到一些术语和概念&#xff0c;例如“打破五日线”&#xff0c;这是新手们需求了解的。本文将介绍“打破五日线”的概念及其意义&#xff0c;同时从不同视点剖析其意义和影响因素。 什…

记录wisemodel上传失败

参考&#xff1a;https://wisemodel.cn/docs/%E6%A8%A1%E5%9E%8B%E4%B8%8A%E4%BC%A0 第一种方法&#xff1a; git lfs install git clone https://oauth2:your_git_tokenwww.wisemodel.cn/username/my_test_model.git也就是用oauth2&#xff0c;然后再按照一般的方法传文件&a…

(三十三)大数据实战——Canal安装部署及其应用案例实战

前言 Canal 是一个开源的MySQL数据库binlog监听和解析框架&#xff0c;用于实时捕获 MySQL数据库的binlog 变更事件&#xff0c;并将其解析成易于消费的数据格式。Canal 可以实时监听 MySQL 数据库的 binlog&#xff0c;并即时捕获数据库的数据变更事件。Canal可以将捕获到的b…

C++ function<>和bind()

一、可调用对象 介绍两个概念&#xff1a;调用运算符和可调用对象 调用运算符 调用运算符&#xff0c;即&#xff1a;() 。跟随在函数名之后的一对括号 “()”&#xff0c;起到调用函数的效果&#xff0c;传递给函数的参数放置在括号内。 可调用对象 对于一个对象或者一个表…

位图+布隆过滤器+海量数据问题(它们都是哈希的应用)

一)位图: 首先计算一下存储一下10亿个整形数据&#xff0c;需要多大内存呢&#xff0c;多少个G呢&#xff1f; 2^3010亿&#xff0c;10亿个字节 byte kb mb gb 100000000个字节/1024/1024/10241G 所以10亿个字节就是1G&#xff0c;所以40亿个字节就是4G&#xff0c;也就是10个整…

Swing基本组件的用法(一)

语雀笔记&#xff1a;https://www.yuque.com/huangzhanqi/rhwoir/paaoghdyv0tgksk1https://www.yuque.com/huangzhanqi/rhwoir/paaoghdyv0tgksk1Java图形化界面: Java图形化界面学习demo与资料 (gitee.com)https://gitee.com/zhanqi214/java-graphical-interface Swing组件层次…

机器学习笔记 - 视频分析和人类活动识别技术路线简述

一、理解人类活动识别 首先了解什么是人类活动识别,简而言之,是对某人正在执行的活动/动作进行分类或预测的任务称为活动识别。 我们可能会有一个问题:这与普通的分类任务有什么不同?这里的问题是,在人类活动识别中,您实际上需要一系列数据点来预测正确执行的动作。 看看…