【Effective C++】设计与声明

条款18:让接口容易被正确使用,不易被误用

  • 见原书

条款19:设计class犹如设计type

  • 一系列准则,见原书

条款20:宁以pass by reference to const替换pass by value

  • pass by reference to const效率高且避免对象切割
  • 内置类型、STL迭代器、函数对象选用pass by value

条款21:必须返回对象时,别妄想返回reference

  • 不要返回local stack对象
  • 返回heap-allocated对象可能会造成资源泄露
  • 返回指向local static对象可能会产生共享等问题

条款22:将变量名称声明为private

  • 可以保持访问的一致性,即调用的public接口都是函数,用小括号
  • protected类型与public封装性一样(封装性与内容改变时造成代码的破坏量成反比,protected成员在derived对象中仍然可以访问)

条款23:宁以non-member、non-friend函数替换member函数

  • 越少的函数访问对象内的数据,封装性越高
  • non-member、non-friend函数和class定义在同一个命名空间内增加代码的封装性和扩充能力
  • 命名空间可以跨源文件合并

条款24:若所有参数皆需要类型转换,请为此采用non-member函数

  • 只有参数被列于参数列才能被隐式转换
复制代码
 1 class Rational{
 2 public:
 3     Rational(int numerator = 0, int denominator = 1);
 4     int numerator() const;
 5     int denominator() const;
 6 
 7     const Rational operator*(const Rational& ) const;
 8 private:
 9     //...
10 };
11 
12 Rational oneEight(1, 8);
13 Rational oneHalf(1, 2);
14 Rational result1 = oneHalf * 2;  //ok     Rational result1 = oneHalf.operator*(2);
15 Rational result2 = 2 * oneHalf; //error   Rational result1 = 2.operator*(oneHalf);
复制代码

条款25:考虑写出一个不抛出异常的swap函数

  • 见原书
posted @   axingzheng  阅读(23)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示