• 高效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函数

  • 相关阅读:
    多行文本溢出显示省略号(…)
    CSS3 grayscale滤镜图片变黑白实例页面
    腾讯TGideas语义化标签(转)
    jQuery Ajax通用js封装
    动态加载 js
    Javascript的四种继承方式
    Android四大组件之Activity
    Android四大组件通信的Intent介绍和详解
    oracle学习笔记(十四) 数据库对象 索引 视图 序列 同义词
    oracle学习笔记(十三) 查询练习(三) 子查询查询
  • 原文地址:https://www.cnblogs.com/chusiyong/p/11451516.html
Copyright © 2020-2023  润新知