zoukankan      html  css  js  c++  java
  • Accustoming_Yourself_to_C++

    //条款1 用const,enum,inline 替换#define
    
    //1 const 替换 #define 常量
    /*
    * 对于浮点数,const double 代码小
    * 在class内不能提供封装性
    * #defien函数用 
    * template<typename>
    * inline dectltype(auto) function 替换
    */
    #include<cstring>
    #include<string>
    class CTextBlock
    {
    public:
        size_t length() const;
    private:
    private:
        char* pText;
        mutable size_t textLength;
        mutable bool lengthIsValid;
    };
    
    size_t CTextBlock::length() const
    {
        if (!lengthIsValid)
        {
            //function const 由于正在通过常量对象访问“textLength”,因此无法对其进行修改    
            //解决:mutable
            textLength = std::strlen(pText);
            lengthIsValid = true;
        }
        return textLength;
    }
    //解决 代码只有返回类型的重复问题:令non-const function 调用另一个 const-function
    class TextBlock
    {
    public:
        const char& operator[](std::size_t position) const
        {
            //bounds chexking
            //log access data
            //verify data integrity
            return text[position];
        }
        char& operator[](std::size_t position)
        {
            return
                const_cast<char&>(//去掉 返回值的const 
                    static_cast<const TextBlock&>//调用 operator[]()const 
                    (*this)[position]);
        }
    private:
        std::string text;
    };
    //因为为 const 成员函数承若绝不改变其对象的逻辑状态,So don't const function call non-const function
    
    //条款四:Make sure that objects are initialized before they're used
    /*
    *在构造函数中使用()初始化:减少一次copy
    
    问题:如果某编译单元(cpp)内的某个non-local static对象的初始化
          使用了另一个编译单元(cpp)的non-local static对象
    
    c++对“定义于不同编译单元内的non-local static对象”的初始化次序并无明确定义
    
    解决:用local static 替换 non-local static(已经被未命名空间取代)
    
    c++保证:函数内的local static 对象会在“该函数被调用期间”“首次遇上该对象的定义”时被初始化
    */
    class FileSystem
    {
    public:
        std::size_t numDisks() const;
    };
    inline FileSystem& tfs() //tfs:the file system
    {
        static FileSystem fs;
        return fs;
    }
    class Directory
    {
    public:
        Directory() = default;
        Directory(std::string params);
    };
    Directory::Directory(std::string params)
    {
        std::size_t disks = tfs().numDisks();
    }
    inline Directory& tempDir()
    {
        static Directory td;
        return td;
    }
    int main()
    {
        return 0;
    }
  • 相关阅读:
    c#自动更新+安装程序的制作
    VS2013项目受源代码管理向源代码管理注册此项目时出错
    WinDbg配置和使用基础
    InstallShield Limited Edition for Visual Studio 2013 图文教程(教你如何打包.NET程序)
    PowerDesigner 如何生成数据库更新脚本
    用户故事(User Story)
    Troubleshooting Record and Playback issues in Coded UI Test
    Coded UI
    compare two oracle database schemas
    How to: Use Schema Compare to Compare Different Database Definitions
  • 原文地址:https://www.cnblogs.com/Z-s-c11/p/14142364.html
Copyright © 2011-2022 走看看