zoukankan      html  css  js  c++  java
  • 高效C++:让自己习惯C++

    视C++为一个联邦语言

    • 面向过程,面向对象,泛型编程,元编程,C++同时支持,强大而迷惑

    • C++语言可以分为如下4个部分:

      • C,C语言相同

      • C with Class,包括封装、继承、多态...

      • Template C,模板元编程

      • STL,标准C++的一部分,主要是和容器、迭代、算法等有关

    • 每个部分有每个部分自己的高效规则,不通用,注意区分

    尽量以const、enum、inline替代#define

    • 以编译器替代预处理器------核心

      • 使用宏报错后,编译器无法提示宏定义的名称,只能提示宏具体的内容

      • 宏定义不会进入到符号表,因此给调试带来一定的麻烦

    • 类中私有的静态变量代替define

    const int Test::Num = 5;
    
    class Test
    {
    private:
        static const int Num;
        int Data[Num];
    }
    • 以枚举代替define

    class Test
    {
    public:
        enum DATATYPE {ONE = 1, TWO = 2}; //作用域为类内,类外加类名访问
    }
    • 以inline替代define

    template<typename T>
    inline void Max(const T& lhs, const T& rhs)
    {
        //函数实现
    }
    
    替代
    
    #define Max(a, b) ((a) > (b) ? (a) : (b)
    • enum和#define不能取地址

    • 对于单纯的常量定义,以const或enum代替define

    • 对于函数宏,以inline函数代替

    尽可能使用const

    • 原因:

      • 明确变量和方法的行为

      • 防止误赋值的情况

    • const可以声明任何变量、对象、参数、函数返回类型、成员函数本体

    • 当const和no-const成员函数功能相同时,no-const使用类型转换调用const函数

    const_cast:移除变量的const属性
    static_cast:
        1)完成基础数据类型
        2)同一个继承体系中类型的转换 
        3)任意类型与空指针类型void*之间的转换
    dynamic_cast:
        使用多态的场景,有继承,有虚函数,向下转型时使用
    reinterpret_cast:
        1)改变指针或引用的类型
        2)将指针或引用转换为一个足够长度的整形、将整型转换为指针或引用类型
        3)不知道用哪一个类型转换就用它

     

    确认对象在使用前已经初始化

    • 最简单的规则,往往最容易被忽视,就像面向对象设计原则中类的单一原则,一不小心就被忽视了,然后导致“破窗”

    • 确认所有的成员变量都在初始化列表中进行初始化,不要等到在构造函数的函数体中进行赋值

    • 以函数内的static变量代替全局变量(因为全局变量的初始化和使用可能在不同的任务中),解决全局变量先使用后初始化的问题

    extern int g_data;
    
    int& getData()
    {
        static int data;
        return data;
    }
  • 相关阅读:
    SpringMVC_04重定向和转发
    Spring事务声明
    SpringMVC_02_RequestMapping
    SpringMVC_01_初识
    Spring通过mybatis操作数据库
    SpringMVC_03_RestFul
    SpringMVC_05_json数据传输
    退役
    2017ICPC青岛 J.Suffix
    版本不兼容问题(未找到程序集)
  • 原文地址:https://www.cnblogs.com/chusiyong/p/11447152.html
Copyright © 2011-2022 走看看