高效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 = 1, int y = 1)
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函数

原文地址:https://www.cnblogs.com/chusiyong/p/11451516.html