More Effective C++学习笔记(6)

目录

  • 条款32:在未来时态下发展程序
  • 条款33:将非尾端类设计为抽象类
  • 条款34:如何在同一个程序中结合C++和C
  • 条款35:让自己习惯于标准的C++语言

条款32:在未来时态下发展程序

  • 事情总是会改变”是一个事实,因此我们写的程序也应该在保证当下程序功能完全实现的前提下,对未来的扩展变化有所预期的进行设计,而不是简单地只完成当下的程序功能任务。Effective C++和More Effective C++的条款中有许多是帮助你的程序在未来可以轻易实现扩展的技巧。
  • 为了强化其他人理解并修改你的程序,避免错误使用,撰写注释只是很浅薄的一层,万一没有被使用者或修改者注意。更好的做法是“以C++本身”阻止或限制某些行为,例如之前条款中有阻止类派生,阻止对象产生或不产生于heap内等等
  • 请努力写出可移植的代码
  • 好好利用封装,使"系统改变所带来的冲击"得以局部化
  • 标准String类型只有非虚析构函数,因此不要以其作为基类派生出别的类
  • 如果类作为一个基类,一般情况下应当给他配一个虚析构函数

条款33:将非尾端类设计为抽象类

  • 对具有继承体系的对象采用指针互相赋值可能存在一些难以避免的问题,例如基类有数据成员(具体类),用两个基类指针p1,p2指向两个不同的派生类对象,再用指针访问对象互相赋值*p1 = *p2,只会改变p1派生类对象中的基类部分,p1对象派生体系中派生类自己独有的部分并未被p2所指对象赋值,这有时会和我们直观上的理解意思(把一个派生类对象赋值给另一个派生类对象)不符,从而出现错误。
  • 最好的做法就是,如果两个具体类需要建立继承体系(有具体类被当作基类),那么两者肯定有相似之处,完全可以将两个类中的共同或相似部分抽象出来,作为一个新的抽象类(可以将析构函数设为纯虚函数),让两个具体类继承于它。这样利于提升软件的健壮度和扩充度。

条款34:如何在同一个程序中结合C++和C

  • 名称重整:C++编译器往往会自动将函数名重整(例如将abc()重整为xyz()),保证所有函数名称独一无二。但C编译器不会进行重整,同一个函数单独分别在C中编译后的函数调用码和C++中编译后,函数调用码很有可能不一样,从而链接时发生错误。通过在C++函数声明前加入extern “C”,可压抑C++的名称重整。
// this function is in assembler — don't mangle its name
extern "C" 
void twiddleBits(unsigned char bits);
extern "C" {                           // disable name mangling for// all the following functionsvoid drawLine(int x1, int y1, int x2, int y2);void twiddleBits(unsigned char bits);void simulate(int iterations);...
}
#ifdef __cplusplus
extern "C" {
#endifvoid drawLine(int x1, int y1, int x2, int y2);void twiddleBits(unsigned char bits);void simulate(int iterations);...
#ifdef __cplusplus
}
#endif
  • Statics的初始化:静态的类对象和定义在全局的、命名空间中的或文件体中的类对象的构造函数通常在main被执行前就被调用。这个过程称为静态初始化。这和我们对C++和C程序的通常认识相反,我们一直把main当作程序的入口。同样,通过静态初始化产生的对象也要在静态析构过程中调用其析构函数;这个过程通常发生在main结束运行之后。由于C中不认识对象的构造与析构,因此尽量在C++代码中写出main函数,可以调用C中的realmain()。
extern "C"                                // implement this
int realMain(int argc, char *argv[]);     // function in C
int main(int argc, char *argv[])          // write this in C++
{return realMain(argc, argv);
}
  • 动态内存分配:只要new分配的内存使用delete释放,malloc分配的内存用free释放,那么就没问题。用free释放new分配的内存或用delete释放malloc分配的内存,其行为没有定义。注意,有些非标准库函数可能里面有用到动态内存分配,需要明确该函数分配内存。
  • 数据结构的兼容性:C中不存在类与类成员,因此为了实现C++和C数据结构兼容,可以借用指针和函数指针。一般情况下,C++的struct内存布局和C一样。但是如果C++的struct有了虚函数,那么内存布局就会发生变化,两者则不兼容。

条款35:让自己习惯于标准的C++语言

学习并实践新的C++语言特性、模板特性、异常处理机制、转型、内存分配、标准模板库STL等等。

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

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

相关文章

dll文件反编译源代码 C#反编译 dotpeek反编译dll文件后export

目录 背景下载安装dotpeek导入dll文件export导出文件参考 背景 项目合作的时候,使用前人的或者其他部门dll文件直接在机台运行,会出现很多问题,逻辑,效率等等,此时我们可以选择对他们的代码进行反编译和重构&#xff…

redisson分布式锁

RLock官网解释 基于Redis的Java分布式可重入锁对象,实现了锁接口。 如果获得锁的Redisson实例崩溃,那么这种锁可能永远挂起在获得状态。为了避免这种情况,Redisson维护了锁看门狗,它在锁持有者Redisson实例活着的时候延长锁过期时…

adb server version (19045) doesn‘t match this client (41); killing.的解决办法

我是因为安装了360手机助手,导致adb版本冲突。卸载之后问题解决 根据这个思路,如果产生"adb server version (19045) doesn’t match this client (41); killing."的错误,检查一下是否有多个版本的adb服务。

算法笔记:哈夫曼树、哈夫曼编码

1 字符的机内表示 2 前缀编码 字符只放在叶结点中字符编码可以有不同的长度由于字符只放在叶结点中,所以每个字符的编码都不可能是其他字符编码的前缀前缀编码可被惟一解码 3 哈夫曼树 哈夫曼树是一棵最小代价的二叉树,在这棵树上,所有的字…

SpotBugs(是FindBugs的继任者)安装、使用

SpotBugs介绍 SpotBugs和FindBugs的关系 SpotBugs是FindBugs的继任者,从SpotBugs停止的地方继续。 备注:FindBugs项目已经停止了,从2015年发布3.0.1版本以后再没有新的版本。 SpotBugs通过静态分析寻找java代码中的bug,通过发现…

网络渗透day10-工具和技术

以下为网络渗透的工具和技术。 让我更详细地描述网络渗透测试的各个阶段以及使用的工具。 1. 信息收集阶段: 目标识别: 在这一阶段,渗透测试人员确定测试的目标,例如特定的服务器、应用程序或网络。 开放源情报(OSIN…

lv3 嵌入式开发-9 linux TFTP服务器搭建及使用

目录 1 TFTP服务器的介绍 2 TFTP文件传输的特点 3 TFTP服务器的适用场景 4 配置介绍 4.1 配置步骤 4.2 使用 5 常见错误 1 TFTP服务器的介绍 TFTP(Trivial File Transfer Protocol)即简单文件传输协议 是TCP/IP协议族中的一个用来在客户机与服务器…

手机也可以搭建个人博客?安卓Termux+Hexo搭建属于你自己的博客网站【cpolar实现公网访问】

文章目录 前言 1.安装 Hexo2.安装cpolar3.远程访问4.固定公网地址 前言 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并结合…

mysql 安全加固

PS:之前在做安全测试的时候,报告mysql有安全漏洞,于是研究了下如何修复,于是记录下来分享给大家 1.1修改mysql 存放位置 修复 1.停服务 service mysqld stop2.迁位置 2.1 新建迁移目录 mkdir /home/database2.2 迁移数据文件…

【MySQL】MySQL8.0安装教程

下载 MySQL官网下载安装包 安装 1、双击安装程序开始安装 2、选择安装类型 选Server only(只安装mysql),然后点击“next”。 3、检测需要的安装, 直接点击Execute开始安装 4、点击next 5、点击next 6、next 7、密码验证方式&a…

这应该是最全的总结了!SQL中的开窗函数汇总!

目录 前言 窗口函数的格式 函数(Function)的类型 开窗函数over() 窗口函数使用 ROW_NUMBER() RANK()与DENSE_RANK() LEAD()与LAG() FIRST_VALUE()与LAST_VALUE() NTILE() MAX()、MIN()、AVG()、SUM()与COUNT() 窗口从句的使用 窗口从句进阶 …

macos13 arm芯片(m2) 搭建hbase docker容器 并用flink通过自定义richSinkFunction写入数据到hbase

搭建hbase docker容器 下载镜像 https://hub.docker.com/r/satoshiyamamoto/hbase/tags 点击run 使用镜像新建容器 填写容器名和 容器与宿主机的端口映射 测试 通过宿主机访问容器内的hbase webUI http://localhost:60010/master-status

I2C与I3C的对比

I2C与I3C的对比 电气特性 I2C 1.半双工 2.串行数据线(SDA)和串行时钟线(SCL) 3.数据线漏极开路,即I2C接口接上拉电阻 4.I2C总线运行速度:**标准模式100kbit/s,快速模式400kbit/s,快速模式plus 1Mbit/s,**高速模式…

深入探讨梯度下降:优化机器学习的关键步骤(三)

文章目录 🍀引言🍀随机、批量梯度下降的差异🍀随机梯度下降的实现🍀随机梯度下降的调试 🍀引言 随机梯度下降是一种优化方法,主要作用是提高迭代速度,避免陷入庞大计算量的泥沼。在每次更新时&a…

[uniapp]踩坑日记 unexpected character > 1或‘=’>1 报错

在红色报错文档里下滑&#xff0c;找到Show more 根据提示看是缺少标签&#xff0c;如果不是缺少标签&#xff0c;看看view标签内容是否含有<、>、>、<号,把以上符合都进行以<号为例做{{“<”}}处理

shell字符串处理之字符串替换、截断

引言 上文我们已经讲了字符串的比较&#xff0c;接下来我们再来学习一下字符串的替换、截断等处理操作。 字符串替换 1. 匹配串只替换一次 stra"aabbcc123" strb${stra/b/s}第一个斜杠后的表示要匹配的模式串&#xff0c;第二个斜杠之后表示要替换后的新串strb的…

Ubuntu编译运行socket.io

本篇文章记录一下自己在ubuntu上编译运行socket.io的过程&#xff0c;客户端选用的是socket.io的c的库&#xff0c;编译起来倒不难&#xff0c;但是说到运行的话&#xff0c;对我来说确实是花了点功夫。毕竟程序要能运行起来才能更方便地去熟悉代码&#xff0c;因此今天我就记录…

MySQL——索引

索引在 MySQL 数据库中分三类&#xff1a; B 树索引Hash 索引全文索引 目的&#xff1a;在查询的时候提升效率 b树 参考&#xff1a;https://blog.csdn.net/qq_40649503/article/details/115799935 数据库索引&#xff0c;是数据库管理系统中一个排序的数据结构&#xf…

百度地图 缩放 0.5 zoomend zoom_changed

设置/获取地图级别官网地址 &#xff1a; https://lbsyun.baidu.com/jsdemo.htm#bSetGetMapZoom 解决方案 //创建一个地图 let map new BMapGL.Map("container"); //这里还需定位下位置&#xff0c;这里就不详细说明了&#xff0c;官方文档有示例 //开启鼠标滚轮缩放…

在VScode中使用sftp传输本地文件到服务器端

安装SFTP 在VScode的扩展中安装sftp 注意这里需要在你没连接服务器的状态下安装&#xff0c;即本机需要有sftp 配置传输端口 安装成功后&#xff0c;使用快捷键"ctrlshiftp",输入sftp&#xff0c;选择Config 根据自己的实际情况修改配置文件&#xff0c;主要改h…