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++:设计与声明的更多相关文章

  1. EffectiveC++ 第4章 设计与声明

    我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter4 设计与声明 Designs and Declarat ...

  2. 《Effective C++》第4章 设计与声明(1)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  3. 【Stage3D学习笔记续】山寨Starling(十):高效游戏设计、纹理集和ATF

    我发布了经过批处理优化的v0.3版,点击下载:https://github.com/hammerc/hammerc-study-Stage3D/archive/v0.3.zip 先看看我们批处理优化后 ...

  4. 《Effective C++》第4章 设计与声明(2)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  5. 【我的Android进阶之旅】 高效的设计稿标注及测量工具Markman介绍

    前言 最近有个烦恼是UI设计师可能太忙了,经常给出的UI设计稿中有很多地方都没有标注,比如长度和颜色值等.这个时候每次都要通过RTX来联系UI设计师或者直接跑到UI设计师面前,喊他重新标注一下,特别影 ...

  6. 《Effective C++》阅读总结(四): 设计、声明与实现

    第四章: 设计与声明 18. 让接口更容易被正确使用,不易被误用 将你的class的public接口设计的符合class所扮演的角色,必要时不仅对传参类型限制,还对传参的值域进一步限制. 19. 设计 ...

  7. Effective C++ ——设计与声明

    条款18:让接口更容易的被使用,不易误用 接口设计主要是给应用接口的人使用的,他们可能不是接口的设计者,这样作为接口的设计者就要对接口的定义更加易懂,让使用者不宜发生误用,例如对于一个时间类: cla ...

  8. 《Effective C++》设计与声明:条款18-条款25

    条款18:让接口容易被正确使用,不容易被误用 注意使用const,explicit,shared_ptr等来限制接口. 必要时可以创建一些新的类型,限制类型操作,束缚对象等. 注意保持接口的一致性,且 ...

  9. Effective C++ —— 设计与声明(四)

    条款18 : 让接口容易被正确使用,不易被误用 欲开发一个“容易被正确使用,不容易被误用”的接口,首先必须考虑客户可能做出什么样的错误操作.  1. 明智而审慎地导入新类型对预防“接口被误用”有神奇疗 ...

随机推荐

  1. Java基础-Java中transient有什么用-序列化有那几种方式

    此文转载于知乎的一篇文章,看着写的非常全面,分享给大家. 先解释下什么是序列化 我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术. Java序列化 ...

  2. 说说TCP的三次握手和四次挥手

    一.传输控制协议TCP简介 1.1 简介 TCP(Transmission Control Protocol) 传输控制协议,是一种 面向连接的.可靠的.基于字节流的传输层 通信协议. TCP是一种面 ...

  3. springboot 2.X 集成redis

    在实际开发中,经常会引入redis中间件做缓存,这里介绍springboot2.X后如何配置redis 1 Maven中引入redis springboot官方通过spring-boot-autoco ...

  4. 解决React Native安装应用到真机(红米3S)报Execution failed for task ':app:installDebug'的错误

    报错信息如下: :app:installDebug Installing APK 'app-debug.apk' on 'Redmi 3S - 6.0.1'Unable to install D:\R ...

  5. Linux下安装MongoDB 4.2数据库--使用tar包方式

    (一)基础环境设置 操作系统版本  :centos-7.4 MongoDB版本:MongoDB 4.2 社区版 (1)关闭防火墙 # 关闭防火墙 [root@mongodbenterprise lib ...

  6. 一条update SQL语句是如何执行的

    一条更新语句的执行过程和查询语句类似,更新的流程涉及两个日志:redo log(重做日志)和binlog(归档日志).比如我们要将ID(主键)=2这一行的值加(c:字段)1,SQL语句如下: upda ...

  7. JavaScript this 关键词

    this是什么呢? JavaScript this 关键词指的是它所属的对象. 它拥有不同的值,具体取决于它所使用的位置: 在方法中,this 指的是所有者对象. 单独的情况下,this 指的是全局对 ...

  8. openstack Rocky 社区版部署1.4 安装数据库

    在控制节点安装mariadb,也可以单独服务器安装数据库,假如多个控制节点就在第一台安装数据库,计算节点不需要安装. 1 安装mariadb相关安装包. yum install mariadb mar ...

  9. MFC 结束线程

    在wtl工程中定义一个现成,如下:DWORD WINAPI ThreadFunc( LPVOID pParam ){if( g_pMainlg )g_pMainlg->DoEnumNetwork ...

  10. vs2010调试运行时弹出对话框:系统找不到指定文件

    很多时候,我们会将一些低版本IDE编译过的项目,搬迁到VS2010 ,那么会存在很多编译,调试问题.[1] 编译成功了.可是无法调试 . .       显示 无法启动程序“...........\t ...