《C++编程规范》读书笔记(中)

实战指南 | Adjust 与 Facebook、Google Ads 自归因配置全流程解析 本文详细解析了Adjust与Facebook、Google Ads自归因配置的全流程,帮助移动应用出海推广者解决广告归因难题。通过自归因功能(SAN),开发者可以获取更准确的数据、简化配置流程并扩大安装来源覆盖,显著提升广告效果监测和ROI计算效率。 阅读详情

 《C++编程规范——101条规则、准则与最佳实践》(C++ Coding Standards——101 Rules, Guidelines and Best Practices)
类的设计与继承

第32条(C):弄清所要编写的是哪种类
第33条(C):用小类代替巨类

    分而治之。用类表示概念。

第34条(B):用组合代替继承

     即优先使用委托而非继承。

第35条(B):避免从并非要设计成基类的类中继承

    本意是要独立使用的类所遵守的设计蓝图和基类大不相同,将独立类用作基类是一种严重的设计错误。

第36条(C):优先提供抽象接口

    偏爱抽象艺术吧。抽象接口是完全由(纯)虚函数构成的抽象类,没有状态(即没有成员数据),通常也没有成员函数实现。注意:在抽象接口中避免使用状态能够简化整个层次结构的设计。

    依赖倒置原理(DIP):1)高层模块不应该依赖低层模块。相反,两者都应该依赖于抽象。2)抽象不应该依赖细节(实现)。相反,细节应该依赖抽象。通常说的“要面向接口编程,而不要面向实现编程”也是这个意思。

第37条(C):公有继承即可替换性。继承,不是为了重用,而是为了被重用

    继承塑模的是“是一个(is a kind of )”关系【Liskov替换原则】。组合塑模的是“有一个(has a kind of )”关系。

第38条(D):实施安全的覆盖

第39条(D):考虑将虚拟函数声明为非公有的,将公有函数声明为非虚拟的

     在基类中进行修改代价是高昂的(尤其对于框架或库)。非虚拟接口模式(NonVirtual Interface, NVI)。

第40条(A):要避免提供隐式转换

     explicit构造函数和命名的转换函数。

第41条(A):将数据成员设为私有的,无行为的聚集除外(即C语言形式的struct)

     保护数据具有公有数据的所有缺点。可以考虑使用Pimpl惯用法用来隐藏类的私有数据成员。

第42条(C):不要公开内部数据

     隐藏数据却又暴露句柄是一种自欺欺人的做法,就像锁上了自家的门,却把钥匙留在了锁上。

第43条(D):明智的使用Pimpl惯用法

// 将类的私有数据隐藏在一个不透明的指针后面
class Map
{
 public:
   // .... 接口
private:
      struct PrivateImpl; // 类Map的嵌套类型
     shared_ptr<PrivateImpl> m_Impl;
};


第44条(D):优先编写非成员非友元函数    

       要避免较成员费:尽可能优先指定为非成员非友元函数。1)减少依赖;2)分离巨类;3)提供通用性。

第45条(D):总是一起提供new和delete

第46条(D):如果提供类专门的new,应该提供所有的标准形式(普通,就地和不抛出)

构造、析构与复制

第47条(A):以同样的顺序定义和初始化成员变量     

       如果违反了该条规则,也会违反第1条 在高警告级别下干净利落地进行编译。

第48条(A):在构造函数中用初始化代替赋值     

       这可不是不成熟的优化,这是在避免不成熟的劣化。

第49条(B):避免在构造函数和析构函数中调用虚拟函数     

        这一点其实很好理解:因为在构造期间,对象还是不完整的,如果在基类的构造函数中调用了虚拟函数,那么调用的将是基类的虚拟函数(不管派生类是否对该虚拟函数进行了改写)。C++标准为什么这样?试想:如果调用的是派生类改写后的虚拟函数版本,那么会发生什么事情?派生类改写该虚拟函数势必会调用派生类的成员数据吧?而在构造基类期间,派生类的数据成员还没有被初始化,使用了未初始化的数据,正是通往未定义行为的快速列车。

// 使用工厂函数插入“后构造函数”调用
class B
{
  protect:
   B() {/*.... */ }
   virtual void PostInitialize() {/*....*/}
  public:
    template<typename T>
   static shared_ptr<T> create() // 函数模板
   {
     shared_ptr<T> p(new T);
     p->PostInitialize();
     return p;
   }
};

class D : public B
{
// ....
};

shared_ptr<D> pD = D::create<D>();  // 创建一个D的对象


第50条(A):将基类析构函数设为公用且虚拟的,或者保护且非虚拟的

第51条(D):析构函数、释放和交换绝对不能失败

第52条(D):一致地进行复制和销毁   

        通常,拷贝构造函数,复制赋值操作符函数,析构函数要么都定义,要么都不定义。

第53条(D):显示地启用或者禁止复制

第54条(D):避免切片。在基类中考虑用克隆代替复制

       将基类的拷贝构造函数声明为受保护的protected, 这样就不能将派生类对象直接传递给接收基类对象的函数,从而防止了对象切片。取而代之在基类中增加一个克隆函数clone()的定义,并采用NVI模式实现。在公有的非虚拟接口clone()函数中采用断言检查继承自基类的所有派生类是否忘记了重写virtual B *doClone()。

第55条(D):使用赋值的标准形式

第56条(D):只要可行,就提供不会失败的swap()(而且要正确的提供)

模板与泛型

第64条(C):理智的结合静态多态性和动态多态性

       动态多态性是以某些类的继承体系出现的,通过虚拟函数和(指向继承层次中的对象的)指针或引用来实现的。静态多态性则是通过类模板和函数模板实现。

第65条(D):有意的进行显示自定义

第66条(D):不要特化函数模板

第67条(D):不要无意地编写不通用的代码

STL:容器

第76条(A):默认时使用vetor。否则,选择其他合适的容器

第77条(B):从vector和string代替数组

第78条(A):使用vector和string::c_str与非C++的API交换数据

       vector的存储区总是连续的;大多数标准库对string的实现,也使用连续内存区(但是不能得到保证)。string::c_str总是返回一个空字符'\0'结束的C风格字符串。string::data也是返回指向连续内存的指针,但不保证以空字符'\0'结束。

第79条(D):在容器中只存储值和智能指针

第80条(B):用push_pack代替其他扩展序列的方式

第81条(D):多用范围操作,少用单元素操作

第82条(D):使用公认的惯用法真正的压缩容量,真正的删除元素

container<T>(c).swap(c); // 去除多余容量的

shrink-to-fit惯用法container<T>().swap(c); // 清空容器c

c.erase(remove(c.begin(), c.end(), value), c.end()); // 删除容器c中所有等于value的元素, erase-remove惯用法

STL:算法

算法即循环——只是更好。算法是循环的模式。开始使用算法,也就意味着开始使用函数对象和谓词。

第83条(D):使用带检查的STL实现

      什么是带检查的STL实现?

第84条(C):用算法调用代替手工编写的循环

      有意识的熟悉,使用STL算法吧。

第85条(C):使用正确的STL查找算法

      find/find_if, count/count_if, binary_search, lower_bound, upper_bound, equal_range

第86条(C):使用正确的STL排序算法

      partition, stable_partition, nth_element, partial_sort, partial_sort_copy, sort, stable_sort

第87条(C):使谓词成为纯函数

第88条(C):算法和比较器的参数应多用函数对象少用函数

第89条(D):正确编写函数对象 

       模板与泛型编程,C++标准模板库STL一直是自己很薄弱的地方,因为在工作中很少使用。这一来是因为自己起初就对这一块不熟悉,进而导致编程时很少使用(都不知道用有哪些功能啊),而越是这样,使用得越少,就更没有机会是熟悉STL,正是形成一个循环。STL有很多的实用功能,以后要有意识的加以使用,学习,争取掌握它。

【异常】Milvus 向量数据库字段缺失错误分析与解决 MilvusVectorStoreServiceV2 - Failed to insert batch [0-1]: The field: 本文分析了Milvus向量数据库插入操作中出现的字段缺失错误。错误显示age_mode字段未提供,导致批量插入失败。根本原因是Milvus Schema要求所有定义字段必须存在,但代码中对部分字段采用条件添加方式。解决方案是将条件添加改为始终添加,为可能为null的字段提供空字符串默认值。文章总结了Schema约束、防御性编程等经验,并建议通过Schema变更检查、单元测试覆盖和数据校验层等预防措施避免类似问题。该问题影响product、mac、source等多个字段,修改后确保了数据插入的可靠性。 阅读详情

相关推荐

VS2022离线安装总闪退?可能是这个--noWeb参数没加对(完整参数指南)

本文深入解析了VS2022离线安装过程中常见的闪退问题,指出核心原因往往在于命令行参数使用不当,特别是`--noWeb`参数。文章提供了完整的参数使用指南和实战解决方案,包括证书处理、安装器文件修复及自动化脚本,帮助用户彻底解决离线部署中的验证失败与闪退难题。

weixin_28842269的博客 758

Hermes Agent 跨会话记忆怎么用?一文讲透持久化记忆的运转原理与整理技巧

用过 AI 助手的人多半有这个体验:每次新开对话,都得重新交代一遍"我是谁、偏好什么、在做什么项目"。Hermes Agent 的持久化记忆系统就是为了解决这件事——它把跨会话记忆写成磁盘上的两个纯文本文件(MEMORY.md 和 USER.md),下次启动自动加载,让助手越用越懂你。本文带你从原理到日常操作,完整看懂这套机制。 ## 为什么每次都要重新自我介绍? 先说结论:**没有持久化记忆

gitblog_00651的博客 993

从MC到DC:三维重建算法的核心原理与实战对比

本文深入对比了三维重建领域两大经典算法Marching Cubes(MC)与Dual Contouring(DC)的核心原理与实战表现。MC算法原理直观、实现简单,但存在特征丢失和二义性问题;DC算法通过求解二次误差函数(QEF)和利用法向量信息,能更好地保留模型的尖锐特征,但计算更复杂。文章结合医学影像处理实例,为开发者根据速度、精度和特征保真度需求选择合适算法提供了清晰指南。

weixin_29251131的博客 1032

CPPCheck

官方主页 http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page 其他人的文档: http://www.dotblogs.com.tw/larrynung/archive/2011/10/29/47866.aspx [C++]使用Cppcheck靜態分析工具輔助檢查C++程式潛在問

liq2004的专栏 2054

AI 小说生成器本地部署完全指南

这篇文章介绍了本地部署AI小说生成器的完整指南,主要面向网文作者、内容创作者和AI爱好者。文章从环境搭建到创作实践,详细讲解了三种主流部署方案:Ollama(推荐新手)、LMStudio(图形界面)和text-generation-webui(高级定制)。内容涵盖硬件需求、系统架构、模型选择、API对接、提示词工程等关键技术环节,并提供了小说创作的特制提示词模板和参数调优建议。文章还讨论了长篇小说管理、多模型协作等进阶技巧,以及版权伦理等法律问题。最后推荐了相关工具资源和社区论坛,帮助读者实现安全、高效、可

珂珂可爱多 2246

电源完整性之Cadence Sigrity Power SI_AC阻抗仿真

之前和大家分享过电源完整性之仿真设计原理链接: [link](https://blog.youkuaiyun.com/weixin_41808082/article/details/117065140?spm=1001.2014.3001.5501).今天接着上一篇文章总结一下电源AC阻抗的的仿真操作流程及一些simulation中的设置参数,用到的时候Cadence Sigrity 中的Power SI组件,下面开始享受仿真的快乐吧: 1.仿真模式选择与文件导入 选择Cadence Sigrity下的Power SI

刘小同学的博客 1万+

《C++编程规范》读书笔记(上)

《C++编程规范——101条规则、准则与最佳实践》(C++ Coding Standards——101 Rules, Guidelines and Best Practices) 组织和策略问题   设计风格   编程风格   函数与操作符

e5Max的专栏 1550

别再只调电压了!深入理解数控电源的CC/CV模式与双闭环PID控制(以BUCK电路为例)

本文深入解析数控电源的CC/CV模式与双闭环PID控制技术,以BUCK电路为例,探讨如何通过双闭环控制优化负载突变响应和模式切换稳定性。文章详细介绍了电压环与电流环的协同工作原理、PID参数整定技巧及工程实践中的非线性补偿方法,帮助工程师提升电源设计的智能控制能力。

weixin_27017211的博客 262

《C++编程规范》笔记(设计风格)

第5条:一个实体应该只有一个紧凑的职责    单一职责原则。这个原则并不那么容易执行,即使是STL这样的程序库,也一样会犯违反该原则的错误。在这里,举了两个违反这一原则的著名实现:realloc和stl 中的basic_string。不过,对于basic_string,我想比起MFC中的CString还是好了不少。在《Exceptional C++ style》中,对basic_string作了剖

不亦快斋 6064

Vue路由守卫实战:利用token实现跨项目免登录跳转(最新版)

本文详细介绍了如何利用Vue路由守卫和Token验证实现跨项目免登录跳转方案。通过核心架构设计、路由守卫精细化控制及Token交换安全实践,有效解决了多系统跳转中的认证问题,提升用户体验和系统连贯性。

n7o8p的博客 137

如何给数据添加高斯白噪声?

首先测试集应该是加噪声的,至于训练集需不需要加噪声就见仁见智了。我个人测试的结果是,训练集如果不加噪声的话效果特别差,如果加噪声的话效果就比较好接受,大家可以自己试试看。在轴承故障研究中免不了要涉及到给数据主动加入噪声的情况,一般我们加的是高斯白噪声。由于热噪声是由大量自由电子的运动产生的,其统计特性服从高斯分布,故常将热噪声称为高斯白噪声。的频谱是均匀分布的,好像白光的频谱在可见光的频谱范围内均匀分布那样,所以热噪声又常称为。定义一:如果一个噪声,它的瞬时值服从。又是均匀分布的,则称它为高斯白噪声。

weixin_50642818的博客 5220

cppcheck c++静态代码检查

转自:http://blog.youkuaiyun.com/fuyangchang/article/details/6727109     一. cppcheck介绍 cppcheck 是一个静态代码检查工具,支持c, c++ 代码;作为编译器的一种补充检查,cppcheck对产品的源代码执行严格的逻辑检查。 执行的检查包括: 1. 自动变量检查 2. 数组的边界检查 3. class类检查

shellching的专栏 5825

生成mm grounding dino的onnx模型并在x-anylabeling中使用

X-AnyLabeling 是一款cvhub开发的交互式自动标注工具,其基于AnyLabeling进行构建和二次开发,在此基础上扩展并支持了许多的模型和功能,并借助Segment Anything和YOLO等主流模型提供强大的 AI 支持。其最新版基于grounding dino可以实现开放词汇检测及生成掩码。2024年,MMDet 3.3.0提出了 MM-Grounding-DINO。

blanokvaffy的博客 1728

C++编程规范 读书笔记(下)

《C++编程规范——101条规则、准则与最佳实践》(C++ Coding Standards——101 Rules, Guidelines and Best Practices) 名字空间与模块 第57条(D):将类型及其非成员函数接口置于同一名字空间中 第58条(D):应该将类型和函数分别置于不同的名字空间中,除非有意想让他们一起工作        ADL(参数依赖查找,也成Koeing

小飞侠 679

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

《GOOGLE C++ 编程规范》读书笔记

GOOGLE C++ 规范读书笔记 1、头文件 1、使用#define避免头文件被重复包含,定义的宏为全路径+文件名; 2、能使用前置声明的地方尽量不使用#include。即如果不需要访问类定义的情况下,使用类的前置声明即可;需要类定义时,则必须得包含头文件。 3、只有当函数只有10行甚至更少时才将其定义为内联函数;内联包含循环或switch语句的函数常常是得不尝失(除非在大多数情况下

pointersky的专栏 989

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

《C++编程规范》读书笔记

什么事匈牙利法?什么是泛型编程?为什么匈牙利法在泛型编程中根本不可行? 如何设置编译器的警告级别? 理解所有的警告,应该通过修改代码而不是降低警告级别来排查警告。 什么是RAII? 多线程的互斥锁应用RAII机制 STL 算法 84.用算法代替手工编写的循环 boost的lambda库 windows11使用最新版本boost的lambda库 boost中Function和Lambda的使用 观察者,桥接,工厂,访问者设计模式 transform for_each replace_if partition算

haimianjie2012的专栏 284

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

c++编程规范读书笔记

C++编程规范Steve McConnell:“始终站在代码阅读者和使用者的角度去编写和组织你的程序。”(一)文件结构头文件(.h/.hpp):程序声明定义文件(.cpp/.cxx):程序实现l1.1版权和版本的声明头文件开始处应列出:版权说明、程序功能、作者、版本号、生成日期、与其它文件的关系等。l1.2头...

weixin_33712881的博客 112

《C++编程规范》读书笔记(下)

《C++编程规范——101条规则、准则与最佳实践》(C++ Coding Standards——101 Rules, Guidelines and Best Practices) 名字空间与模块   模板与泛型   错误处理与异常   STL:容器   STL:算法   类型安全

e5Max的专栏 1803

C++ 编程规范101读书笔记(0)引论

前一段时间,工作和生活的事情比较多,一直没有时间好好地来学习,博客一直没有什么有价值的东西更新。最近把以前的工作辞了,也有时间来看看以前买的书,C++这方面的书,我有几本:> ,>,提高C++性能的编程技术>>,  以前只是扫描地看了一两遍。这次,想仔细地再看一遍,并在博客上整理出来,做个记录。

老程序员专栏 601

C++编程规范之编程风格(读书笔记)

第14条 宁要编译时和连接时错误,也不要运行时错误。摘要能够在编译时做的事情,就不要推迟到运行时:编写代码时,应该在编译期间使用编译器检查不变式(invariant),而不应该在运行时再进行检查。运行时检查取决于控制流和数据的具体情况,这意味着很难知道检查是否彻底。相比而言,编译时检查与控制流和数据无关,一般情况下能够获得更高的可信度。讨论C++语言中提供了强大的静态检查功能,而对自动运行时检

经天纬地 856

C++编程规范之stl容器(读书笔记)

第76条 默认时使用vector。否则,选择其他合适的容器第77条 用vector和string代替数组摘要:有助于编写更安全,伸缩性更好的软件第78条 使用vector(和string::c_str)与非C++ API交换数据摘要:vector和string::c_str是与非c++ api通信的通道,但是不要将迭代器当作指针,要获取vector::iterator iter所引用的元素

经天纬地 827

C++编程规范之设计风格(读书笔记)

第5条 一个实体应该只有一个紧凑的职责摘要一次只解决一个问题:只给一个实体(变量、类、函数、名称空间、模块和库)赋予一个定义良好的职责。随着实体变大,其职责范围自然也会扩大,但是职责不应该发散。第6条 正确、简单和清晰第一摘要软件简单为美(Keep It Simple Software,KISS):正确优于速度。简单优于复杂。清晰优于机巧。安全优于不安全(见第83条和第99条)

经天纬地 844

C++编程规范(读书笔记,待续)

组织和策略问题 在高警告级别干净利落地进行编译 使用版本控制系统 设计风格 一个实体应该只有一个紧凑的职责 不要进行不成熟的优化 避免进行不成熟的劣化 尽量减少全局和共享数据 隐藏信息 编程风格 宁要编译时和连接时错误,也不要运行时错误 积极使用const 避免使用宏 避免使用“魔数” 尽可能局部地声明变量 总是初始化变量 避免函数过长,避免嵌套过深 函数与操作符 保持重载操作符的自然语义 优先使用

机器人们的后勤仓库 427

读书笔记:《C++ 编程规范——101条规则、准则与最佳实践》(3)编程风格

豆瓣链接:《C++ 编程规范——101条规则、准则与最佳实践》 一个人的常量可能是另一个人的变量。——Alan Prelis 第 14 条:宁要编译、链接时错误,也不要运行时错误 以下是一些静态检查的例子: 编译时布尔条件 如果有些布尔值可以在编译期获得并需要检查,可以用 static_assert 代替运行时检查的 assert 。 编译时多态 用 “模板”...

Zhaosiyii的博客 420

C++编程规范之stl算法(读书笔记)

第83条 使用带检查的STL实现摘要:安全第一,大多数带检查的stl都会通过在容器和迭代器中添加附加的调试和支持信息来自动的检查这些错误。第84条 用算法调用代替手工编写的循环第85条 使用正确的STL查找算法第86条 使用正确的STL排序算法 摘要:理解每个排序算法的作用,选择能够实现所需而开销最低的算法。第87条 使谓词成为纯函数第88条 算法和比较器的参数应多用函数对象少

经天纬地 1002

C++编程规范之函数与操作符(读书笔记)

第25条 正确地选择通过值、(智能)指针或者引用传递参数 摘要: 正确选择参数,分清输入参数、输出参数和输入/输出参数,分清值参数和引用参数。正确的传递参数。选择参数的准则:对只输入参数始终用const限制所有指向只输入参数的指针和引用优先通过值来取得原始类型和复制开销比较低的值对象的输入。优先按const的引用取得其他用户定义类型的输入如果函数需要其参数的副本,则可以考虑通过值传递代替通过引用传

经天纬地 779
上一篇: 《C++编程规范》读书笔记(上)
下一篇: 《C++编程规范》读书笔记(下)
e5Max
博客等级 码龄14年 145粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值