高效C++:设计与声明
C++软件开发可以理解为设计一系列的类,让这些类相互使用,最终实现我们所需要的功能。类与类之间的相互关系可以很复杂,也可以很简单,如何简单高效的描述类与类之间的关系是设计的难点之一。遵循本文所提供的方法,将会给你一些灵感。
让接口容易被正确使用,不易被误用
限制类型的办法:建立新类型,限制类型上的操作,束缚对象的值、消除客户管理资源的责任
- 限制函数的入参类型,可以保证参数不被错误传入
“促进接口被正确使用”的方法:接口的一致性
在版本发布的过程中,应该保持接口的一致性,不要随意更改接口
设计class犹如设计type
新的type对象应该如何被创建和销毁?
对象的初始化和赋值应该有什么样的差别?
pass-by-value or pass-by-reference ?
什么样的type合法 ?
需要什么样的类型转换?
需要定什么样的方法以及方法的权限 ?
等等
以pass-by-reference-to-const代替pass-by-value
尽量以pass-by-reference-to-const代替pass-by-value,因为前者比较高效,原因是少一次类的拷贝动作
对于内置类型和STL,pass-by-value比较高效(特殊场景,单独说明)
必须返回对象时,别妄想返回reference
绝对不要返回指针和引用指向local stack变量---直接导致偶发跑飞
绝对不要返回指针和引用指向heap变量,容易内存泄露,特别是多任务---容易导致忘记释放和多次释放的问题
将成员变量声明为private
将成员变量设置成private,可以提供访问数据的一致性、控制数据的访问权限、并提供冗余
protect并不比public安全---子类对基类而言,也是外部
宁可用non-member non-friend函数替代member函数
用non-member non-friend函数替代member函数,可以增加类的封装性、冗余性
越少的代码操作类中数据,类的封装性越好
特别是对于不同功能类的函数,可以通过namespace区分
namesace {
class Web{}
void ClearWeb(Web& web) //non-member non-friend
}
如果你需要为所有的参数提供类型转换,那么这个函数必须是non-member
class Rational
{
public:
Rational(int x = , int y = )
private:
int x;
int y;
public:
const Rational operator*(const Rational& rhs)
{
//错误,不满足交换律
}
} //支持Rational的算术运行
const Rational operator*(const Rational& lhs, const Rational& rhs)
{
//正确,可以满足隐式类型转换和交换律
}
考虑写出一个不跑异常的swap函数
STL源码中的swap函数如下:
namespace std{
template <typename T>
void swap(T& a, T&b) //需要类支持拷贝构造函数和拷贝赋值操作符
{
T temp(a);
a = b;
b = temp;
}
}
如果需要自定义swap函数
高效C++:设计与声明的更多相关文章
- EffectiveC++ 第4章 设计与声明
我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter4 设计与声明 Designs and Declarat ...
- 《Effective C++》第4章 设计与声明(1)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- 【Stage3D学习笔记续】山寨Starling(十):高效游戏设计、纹理集和ATF
我发布了经过批处理优化的v0.3版,点击下载:https://github.com/hammerc/hammerc-study-Stage3D/archive/v0.3.zip 先看看我们批处理优化后 ...
- 《Effective C++》第4章 设计与声明(2)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- 【我的Android进阶之旅】 高效的设计稿标注及测量工具Markman介绍
前言 最近有个烦恼是UI设计师可能太忙了,经常给出的UI设计稿中有很多地方都没有标注,比如长度和颜色值等.这个时候每次都要通过RTX来联系UI设计师或者直接跑到UI设计师面前,喊他重新标注一下,特别影 ...
- 《Effective C++》阅读总结(四): 设计、声明与实现
第四章: 设计与声明 18. 让接口更容易被正确使用,不易被误用 将你的class的public接口设计的符合class所扮演的角色,必要时不仅对传参类型限制,还对传参的值域进一步限制. 19. 设计 ...
- Effective C++ ——设计与声明
条款18:让接口更容易的被使用,不易误用 接口设计主要是给应用接口的人使用的,他们可能不是接口的设计者,这样作为接口的设计者就要对接口的定义更加易懂,让使用者不宜发生误用,例如对于一个时间类: cla ...
- 《Effective C++》设计与声明:条款18-条款25
条款18:让接口容易被正确使用,不容易被误用 注意使用const,explicit,shared_ptr等来限制接口. 必要时可以创建一些新的类型,限制类型操作,束缚对象等. 注意保持接口的一致性,且 ...
- Effective C++ —— 设计与声明(四)
条款18 : 让接口容易被正确使用,不易被误用 欲开发一个“容易被正确使用,不容易被误用”的接口,首先必须考虑客户可能做出什么样的错误操作. 1. 明智而审慎地导入新类型对预防“接口被误用”有神奇疗 ...
随机推荐
- 一位老程序员说,有这份python3的开发指南,月薪能突破20K
推荐视频: AI人工智能识别技术_第一节AI人工智能识别技术_第二节Python基础案例之教你如何查询对方IP_第一节Python基础案例之教你如何查询对方IP_第二节 有程序员说,这份python3 ...
- Spring Boot是什么?
背景 最近因公司需要,开始研究java相关的开发,之前一直从事.net相关开发,所以写的或者理解的不对的地方呢,希望大家批评指正. 首先开发框架吧,就像.net很早之前有asp.net webForm ...
- [USACO11JAN]Roads and Planes G【缩点+Dij+拓补排序】
题目 Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条道路 (1 < ...
- 【FastDFS】如何打造一款高可用的分布式文件系统?这次我明白了!!
写在前面 前面我们学习了如何基于两台服务器搭建FastDFS环境,而往往在生产环境中,需要FastDFS做到高可用,那如何基于FastDFS打造一款高可用的分布式文件系统呢?别急,今天,我们就一起来基 ...
- 电脑添加多个SSH key
创建新得ssh key ssh-keygen -t rsa -C "excem@excemple" -f ~/.ssh/id_rsa.gitlab 编辑config vim ~/. ...
- 面试必杀技,讲一讲Spring中的循环依赖
本系列文章: 听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configu ...
- 13.Camera摄像机常用属性
选中Main Camera相机,在最右侧的Inspector面板可以看到有Camera组件,该组件下有一些摄像机常用的属性. 1.Clear Flags属性 SkyBox:天空盒(默认效果,场景会有天 ...
- DNP3协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析Modbus所含功能码
现在网上有很多类似的文章.其实这一篇也借鉴了很多其他博主的文章. 写这篇文章的重点是在于解析功能和报文.对Dnp3这个协议并不会做很多介绍. 那我们就开始吧 上图则为dnp3协议整体的报文模型(点击红 ...
- jvm之栈、堆
1. Java Virtual Machine 人群当中,一位叫java的小伙子正向周围一众人群细数着自己取得的荣耀与辉煌.就在此时,c老头和c++老头缓步走来,看着被众人围住的java,c老头感 ...
- JVM 学习笔记(四)
回顾: 在之前的文章中,我们主要体现了当堆内存设置的比较小的情况下,比如:-Xmx20M -Xms20M,在项目运行的过程中,不断往内存中去添加对象, 这时候就会出现OOM,也就是内存溢出,本文章将展 ...