当前位置: 首页 > news >正文

学习Boost二:从附录3来看编码习惯

附录C 关键字浅谈

在C++11标准中(C++11.2.12)总共定义了73个关键字(keyword)、2个“准”关键字(identifiers with special meaning)和11个操作符替代字(alternative representation)[1]。

虽然 C++标准中的关键字很多,但并不都是有用的,有些已经被废弃,有些因使用不当则会导致“代码坏味”,作者将谈谈自己在多年开发过程中对它们的一些认识,仅作一家之言。

  1. 废弃的关键字
    register。它已经在C++11里被正式废弃,现在的C++代码中不应该再出现这个单词。

  2. 停用的关键字
    export。C++98引入这个关键字,它在C++11中被停用但保留。

  3. 建议不使用的关键字
    C++从C中继承了很多关键字,所以它也继承了C语言面向过程的一些缺点,有些关键字应当慎用或不用,这样可以很好地避免“反模式”,绕过一些容易令人困惑的陷阱。

goto。首当其冲的当然是 goto,它带来的流程混乱问题已经众所 周知,应当使用 breakcontinuereturn 等关键字来控制程序流程, 让代码逻辑更清晰。

switch-case。多分支开关语句同样会导致代码难以理解,不利 于维护,在面向对象的语言里可以用状态模式来消除 switch-case 的使 用,也可以用if+returnmap+function来替代switch-case语句。

else。滥用if-elseif-else的多重嵌套是与switch-case同样 令人厌恶的存在,它引入了多个逻辑条件,使程序的流程很混乱,而 且会导致遗漏逻辑判断的隐患。消灭else关键字需要有清晰的头脑, 仔细分析业务逻辑,设计代码结构,多数情况下可以在if语句里及时 用return来结束函数。

while/dowhile{}do{}while 循环是旧时代的遗产,完全可 以用for 取代它们,而且在C++11 中,for 还支持基于范围的循环,更加安全。比较常用的无限循环while(1)也可以用更简洁的for (;;)代替。

new/delete。它们曾经的任务是取代mallocfree,但它们并没 有解决内存泄漏的根本问题,现在应该使用标准库里的智能指针和vector等容器。

  1. 建议积极使用的关键字

auto。C++11里的auto关键字能够自动推导表达式类型,为程序 员提供了以前只有编译器才拥有的能力,极大地简化了我们声明对象 时的工作,非常方便,因此应该尽量多用它。不过需要注意它的语 义,auto总是推导出“值”语义,有的时候需要使用“auto&”或“auto&&”的形式避免拷贝代价(如在 for 循环里)。

default。这个 default 不用于 switch 语句,而用于声明构造函数 或析构函数的默认实现,明确地写出它不仅可以告诉编译器也可以告 诉代码阅读者,这个类是一个“no trival”的类。

nullptr。它取代了容易引起歧义的NULL和0,是语法层面上真正的空指针,相当于其他语言里的None/Nil,使用它可以使代码获得更 强的安全性。

  1. “准”关键字

所谓“准”关键字,其实并不是关键字,它们只是普通的单词,

但能够在特定的C++语境里产生语法效果,此外没有其他的特殊含义。目前 C++标准仅定义了两个“准”关键字:finaloverride,用于类继承体系的控制,可以很好地增强表达能力,建议使用。

final。用于标识类或成员函数,禁止子类继承或重载。

override。用于标识虚函数,明确地表示成员函数重载了父类的 同名函数,避免误覆盖(overload)。

希望读者能够在今后的实践中采纳本文的建议,书写出更优雅易 读、给人看而不是给机器人看的代码。


使用 if-else 来完成全流程覆盖,不如使用 if-return 来完成筛查。

override在继承虚函数的子类声明的引号最后处表明。

map + function 是通过重载的方式,实现了 if-else逻辑选择替代方案

if-return则是另一种思路,通过反向筛选的方式,把不合格的数据剔除。从而保证了数据的安全。

状态设计模式则是更加上一层,从具体的代码逻辑层次调升到了面对对象实现方式,它有更好的可扩展性(增加继承子类),更好的私密性(单独类内管理,彼此分割),更贴合低耦合、高内聚的方式。

  • [[二十三种设计模式:状态模式]]
  • [[状态设计模式:代码介绍]]
  • [[map + function 实现替代if - else]]
  • [[C++11 新特性:default]]

相关文章:

学习Boost二:从附录3来看编码习惯

附录C 关键字浅谈 在C11标准中(C11.2.12)总共定义了73个关键字(keyword)、2个“准”关键字(identifiers with special meaning)和11个操作符替代字(alternative representation)[1]。…...

STM32基础入门学习笔记:核心板 电路原理与驱动编程

文章目录: 一:LED灯操作 1.LED灯的点亮和熄灭 延迟闪烁 main.c led.c led.h BitAction枚举 2.LED呼吸灯(灯的强弱交替变化) main.c delay.c 3.按键控制LED灯 key.h key.c main.c 二:FLASH读写程序(有…...

最后一次模拟考试题解

哦我想这不用看都知道是为了水任务 T1 黑白染色 其实这题有原 什么手写体 md (指 markdown) 分析 首先这题如果你题目没看错的话 ,会发现其实他是 n m n \times m nm 让你求 n n n \times n nn 的区域内的点(不会只有我一个人题目看错了罢 然后我们会发现…...

Mac 创建和删除 Automator 工作流程,设置 Terminal 快捷键

1. 创建 Automator 流程 本文以创建一个快捷键启动 Terminal 的自动操作为示例。 点击打开 自动操作; 点击 新建文稿 点击 快速操作 选择 运行 AppleScript 填入以下内容 保存名为 “Open Terminal” 打开 设置 > 键盘,选择 键盘快捷键 以此选择 服…...

2023华为OD机试真题B卷 Java 实现【最长的元音串】

前言 本题使用Java解答,如果需要Python代码,链接 题目 给定一个只由英文字母(a-z, A-Z)组成的字符串,找出其中最长的只包含元音字母(a, e, i, o, u, A, E, I, O, U)的子串,并返回其长度。如果不存在元音子串,则返回0。 输入: 一个由英文字母组成的字符串,长度大…...

网络防御之传输安全

1.什么是数据认证,有什么作用,有哪些实现的技术手段? 数据认证是一种权威的电子文档 作用:它能保证数据的完整性、可靠性、真实性 技术手段有数字签名、加密算法、哈希函数等 2.什么是身份认证,有什么作用,有哪些…...

【css】组合器

组合器是解释选择器之间关系的某种机制。在简单选择器器之间,可以包含一个组合器,从而实现简单选择器难以达到的效果。 CSS 中有四种组合器: 后代选择器 (空格):匹配属于指定元素后代的所有元素,示例:div …...

HTTPS、TLS加密传输

HTTPS、TLS加密传输 HTTPS、TLS加密传输1、HTTPS(HyperText Transfer Protocol Secure)2、TLS HTTPS、TLS加密传输 1、HTTPS(HyperText Transfer Protocol Secure) HTTPS(HyperText Transfer Protocol Secure&#x…...

docker frp 搭建 http + stcp 代理

所需服务器 2台 一台具有国外公网ip 一台具有国内 ip 内网外网都可以 外公网ip服务器配置如下 cat docker-compose.yamlversion: "2" services:frps:image: alpine:latesthostname: frpsrestart: alwayscontainer_name: frpsprivileged: trueuser: rootcommand: […...

项目出bug,找不到bug,如何拉回之前的版本

1.用gitee如何拉取代码 本文为转载于「闪耀太阳a」的原创文章原文链接:https://blog.csdn.net/Gufang617/article/details/119929145 怎么从gitee上拉取代码 1.首先找到gitee上想要拉取得代码URL地址 点击复制这里的https地址 1 ps:(另外一种方法&…...

vue-cli

vue-cli脚手架 案例一: 案例二: 案例三: ​ 一、脚手架简介 Vue脚手架是Vue官方提供的标准化开发工具(开发平台),它提供命令行和UI界面,方便创建vue工程、配置第三方依赖、编译vue工程 1. …...

android获取屏幕分辨率的正确方法;获取到分辨率(垂直方向像素)的不正确

我通过下面的方法去获取屏幕分辨率的,但获取到的分辨率有时会不准确。原因是此方法有时候会忽略一些布局或控件的高度,从而得不到正确的高度。 public static String getDeviceResolution(Context context){//从系统服务中获取窗口管理器WindowManager w…...

机器学习笔记之优化算法(八)简单认识Wolfe Condition的收敛性证明

机器学习笔记之优化算法——简单认识Wolfe Condition收敛性证明 引言回顾: Wolfe \text{Wolfe} Wolfe准则准备工作推导条件介绍推导结论介绍 关于 Wolfe \text{Wolfe} Wolfe准则收敛性证明的推导过程 引言 上一节介绍了非精确搜索方法—— Wolfe \text{Wolfe} Wolf…...

通过win+r安装jupyter报错

通过pip install jupyter安装jupyter报错处理办法 1、python 更新到最新版,最好多执行几次后在安装jupyter python.exe -m pip install --upgrade pip 2、通过镜像安装 pip install jupyter --force-reinstall pip -i http://pypi.douban.com/simple/ --trusted-h…...

C#声明一个带返回值的委托

1、声明 public delegate string TestDel(string str); 2、使用 TestDel t; t (string str) > str; t (string str) > str "1"; t (string str) > str "2"; t (string str) > str "3"; Console.WriteLine(t ("hhhh&qu…...

Flutter 自定义view

带进度动画的圆环。没gif,效果大家自行脑补。 继承CustomPainter,paint()方法中拿到canvas,绘制API和android差不多。 import package:flutter/material.dart;class ProgressRingPainter extends CustomPainter {double strokeWidth 20;Col…...

Ubuntu新装系统报错:sudo: vim:找不到命令

问题: 新安装的老版本Ubuntu系统,发现在使用vim命令的时候报错: sudo:vim:找不到命令 解决办法 这是因为没有安装vim,直接运行下面命令安装vim sudo apt-get install vim...

Vue3自定义简单的Swiper滑动组件-触控板滑动鼠标滑动左右箭头滑动-demo

代码实现了一个基本的滑动功能,通过鼠标按下、鼠标松开和鼠标移动事件来监听滑动操作。 具体实现逻辑如下: 在 onMounted 钩子函数中,我们为滚动容器添加了三个事件监听器:mousedown 事件:当鼠标按下时,设置…...

三个主流数据库(Oracle、MySQL和SQL Server)的“单表造数

oracle 1.创建表 CREATE TABLE "YZH2_ORACLE" ("VARCHAR2_COLUMN" VARCHAR2(20) NOT NULL ENABLE,"NUMBER_COLUMN" NUMBER,"DATE_COLUMN" DATE,"CLOB_COLUMN" CLOB,"BLOB_COLUMN" BLOB,"BINARY_DOUBLE_COLU…...

TypeScript 中【class类】与 【 接口 Interfaces】的联合搭配使用解读

导读: 前面章节,我们讲到过 接口(Interface)可以用于对「对象的形状(Shape)」进行描述。 本章节主要介绍接口的另一个用途,对类的一部分行为进行抽象。 类配合实现接口 实现(impleme…...

第一次喝精酿怎么品

精酿酒吧新手指南:四步解锁品酒技巧,轻松告别困惑第一次走进精酿酒吧,新手常因陌生酒名和风味描述困惑。其实品精酿很简单,掌握几个步骤即可入门——这种认真品酒的态度,早在中世纪就有,欧洲修士们酿造后会…...

Adobe-GenP 3.0深度解析:破解Adobe Creative Cloud订阅验证的技术实现

Adobe-GenP 3.0深度解析:破解Adobe Creative Cloud订阅验证的技术实现 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe Creative Cloud订阅模式为设…...

信号净化实战:从基础平滑到智能去噪

1. 信号净化入门:为什么我们需要处理噪声? 第一次接触传感器数据时,我被现实狠狠上了一课——实验室里漂亮的平滑曲线在真实场景中根本不存在。记得去年处理工厂振动传感器数据时,原始信号看起来就像心电图叠加了摇滚乐节奏。这种…...

微软UFO项目:基于视觉大模型的GUI自动化智能体实战解析

1. 项目概述:当“全能”AI助手遇见复杂任务编排 最近在AI应用开发圈里,一个来自微软研究院的项目“UFO”引起了我的注意。这名字听起来挺科幻,全称是“UI-Focused Agent”,直译过来是“专注于用户界面的智能体”。但别被这个直白的…...

KISS原则在大模型时代的生死线:DeepSeek工程化落地中被忽略的4类隐性复杂度(附NASA级简洁度评分表)

更多请点击: https://intelliparadigm.com 第一章:KISS原则在大模型时代的生死线:从哲学信条到工程铁律 为何越“聪明”的系统越需要极简设计 当大模型参数突破千亿、推理链路横跨数十个微服务、提示工程嵌套七层模板时,KISS&am…...

3D打印技术如何重塑消费电子供应链:从原型验证到小批量生产

1. 项目概述:当3D打印遇上消费电子最近几年,我身边不少做产品设计、硬件开发的朋友,聊天时总会不约而同地提到一个词:3D打印。以前大家觉得这玩意儿就是个做手办、打样机的“玩具”,但现在风向明显变了。尤其是在消费电…...

如何评估拓客数据的有效性?避开无效内耗,精准提效

当下企业拓客越来越注重精细化,不少团队投入大量精力收集数据,却陷入“数据越多,效果越差”的困境——空号、无效线索、非目标客群占据大半,不仅浪费人力成本,更拖慢增长节奏。其实,拓客的核心不在于“量”…...

LizzieYzy围棋AI分析平台:从棋谱复盘到AI教练的完整指南

LizzieYzy围棋AI分析平台:从棋谱复盘到AI教练的完整指南 【免费下载链接】lizzieyzy LizzieYzy - GUI for Game of Go 项目地址: https://gitcode.com/gh_mirrors/li/lizzieyzy 围棋作为世界上最复杂的棋类游戏之一,其学习曲线一直被认为是陡峭而…...

端口聚合(Eth-Trunk)实验总结 —— 让两根网线“抱团”干活

企业场景:公司两栋楼之间只有两根网线相连,既要带宽加倍,又要一根线断了业务不中断。端口聚合就是让两根线“手拉手”变成一条逻辑链路,协同工作。📌 实验拓扑(两台交换机,两根网线互联&#xf…...

Stardew Valley Mod开发:使用OpenClaw主题框架快速构建原生风格UI

1. 项目概述:一个为Stardew Valley Mod开发者量身打造的主题框架如果你是一位《星露谷物语》(Stardew Valley)的模组(Mod)开发者,或者正打算踏入这个充满创造力的社区,那么你很可能已经体会过&a…...