zoukankan      html  css  js  c++  java
  • Effective C++这书很好

    【1】视C++为一个语言联邦

    C++包含4个次语言:C,面向对象C++,模板,STL。

    C:C++是以C语言为基础一门语言,其基本的blocks,statements,preprocessor等都是一样的

    面向对象C++:封装,继承,多态

    模板:泛型编程基础

    STL:对容器,迭代器,算法紧密的配合与协调

    【2】尽量用const,enum,inline替代#define

    其原因是尽量用编译器替换预处理器。

    const可以获取地址,但是enum和define不可以获取地址,方便隐藏。

    【3】尽可能使用const

    const是一个语义约束。指针常量&常量指针不必赘述。

    (1)函数返回考虑加const,const int func() {}。看似无意义,其实是为了防止func() = val这样的操作,误把==写成=,触发一次转换

    (2)两个成员函数如果仅是常亮性不同(尾部const,并非返回const),可以重载!!!!作用于const和non-const obj上——重要成员函数重载特性

    【4】确定对象被使用前已先被初始化

    避免“跨编译单元之初始化次序”。给出了一个方法:把非本地变量改为本地变量,其核心思想是:把全局的不确定初始化顺序的问题转换为在初始化的地方,动态调用函数来初始化从而约束初始化顺序。

    比如一个类初始化以来另一个类的对象,但是不能确认两个类谁先初始化。那么可以在此类初始化时调用一个函数,该函数返回静态的另一个类的对象,及保证了该类初始化时另一个类必然初始化了。

    【5】了解C++默默编写并调用哪些函数

    编译器默认创建public default的构造,拷贝,赋值函数

    【6】若不想使用编译器自动生成的函数,就明确拒绝

    禁止拷贝的方法

    (1)声明为private——不好,因为member和friend函数可以调用

    (2)从一个禁止拷贝的类private继承

    (3)C++11引入delete——这个最好

    【7】为多态基类声明virtual析构函数

    【8】别让异常逃离析构函数

    1. 析构一定要吞下异常,保证终止

    2. 如果调用者需要做异常处理,则类需要提供处理函数,析构也需要保证调用处理函数

    【9】不在构造和析构中调用virtual函数

    因为在调的时候,都是在本类的构造或者析构,不体现父类或子类特性,多态失效。所以尽量在构造和析构中做简单的操作。

    【10】令operator=返回一个reference to *this

    【11】在operator=中处理“自我赋值”

    建议的代码:

    Widget& Widge::operator=(const Widget &rhs)
    {
        if (this == &rhs)
            return *this;
    
        // assign rhs to this
        return *this;  
    }

    书上提出了一张更好的赋值,考虑了prefetching,caching,pipelining

    Widget& Widge::operator=(const Widget &rhs)
    {
        Widget tmp(rhs);
        swap(tmp);
    
        return *this;  
    }

    就是浪费了一些空间,不过没有分支,不打乱流水

    【12】复制对象时勿忘其每一个成分

    可以在子类的拷贝构造中指定父类的构造函数

    【13】——【17】资源管理

  • 相关阅读:
    spark内存管理这一篇就够了
    spark推测机制及参数设置
    python易错点汇总,不定期更新
    Spark架构与原理这一篇就够了
    MySQL查询这一篇就够了
    pyspark计算最大值、最小值、平均值
    Spark性能调优的方法
    大流量场景下MySQL如何准备
    100台CentOS7要分区怎么办?
    100台CentOS7要升级OpenSSH怎么办?
  • 原文地址:https://www.cnblogs.com/wyc199288/p/14402094.html
Copyright © 2011-2022 走看看