• 读书笔记:Effective C++ 2.0 版 1997年Scott Meyers,条款1、2、3、4


    目的:重新过一遍这本书。

    条款1:尽量用const和inline而不用#define。尽量用编译器而不用预处理。

    #define ASPECT_RATIO 1.653 //存在类型安全性问题
    const double ASPECT_RATIO = 1.653; //类型安全,常量定义
    const char * const authorName = "Scott Meyers"; //指针定义有两个const
    class GamePlayer {
    private:
    	enum { NUM_TURNS = 5 } //
    	static const int NUM_TURNS = 5; // constant eclaration 
    	static const double FACTOR = 1.35;//
    };
    #define max(a,b) ((a) > (b) ? (a) : (b)) //max(++a, b) 出错
    inline int max(int a, int b) { return a > b ? a : b; } //更安全,但只支持int
    template<class T>
    inline const T& max(const T& a, const T& b)
    { return a > b ? a : b; } //内联模板解决类型问题,与define等价,且安全
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    以上条款在cpp中可行。在c中也需要尽量参考。

    条款2:尽量用而不用
    类型安全和扩展性是C++的基石。
    c函数安全性差些,但可控性更好,使用者需要自己做的事更多。

    int i;
    Rational r;// r 是个有理数
    cin >> i >> r;
    cout << i << r;
    class Rational {
    public:
    	Rational(int numerator = 0, int denominator = 1);
    private:
    	int n, d;// 分子,分母
    	friend ostream& operator<<(ostream& s, const Rational& );//自定义类型支持<<运算符
    };
    ostream& operator<<(ostream& s, const Rational& r){
    	s<< r.n << '/' << r.d;
    	return s;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    个人不是完全支持这一条款,因为c语言风格的性能往往更好。cpp风格一般多了函数调用成本,但编译期实现是否可以通过内联完全优化掉,值得怀疑。
    cpp的可移植性没有c好。
    c语言把更多的事情交给了用户去决定,cpp方便了用户,但有所牺牲。

    条款3:尽量用new和delete而不用malloc和free

    这个不做过多解释,cpp的new、delete在编译期会自动加上构造析构函数的调用.
    这个既是cpp的优点也是cpp的缺点,但既然用cpp,那就应该用new和delete。
    
    malloc和free不需要区分是否是数组。new和delete需要区分有无[]。
    不要混用new、delete、malloc、free。
    对于大内存申请,地址尽量以4096为边界,另外尽量不用去memset 0,也尽量不要去构造析构。
    大内存还是c风格更好,少了构造析构,也少了初始化0,没有初始化0也就没有真的获得内存。内存是在第一次被访问时才会被真的分配。
    c语言还有realloc这种神器,背后的实现有待深入调查。realloc可以扩大也可以缩小申请的区域,甚至应该还有自动拷贝,自动内存整理回收,重新映射内存表。
    void* calloc( size_t num, size_t size )不太一样,会自动初始化0,个人不太推荐这个自动初始化0
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    条款4:尽量使用c++风格的注释

    c风格/*  ... */
    cpp风格  //
    老版本c编译器可能不认识 //  导致注释成为宏的内容。
    
    • 1
    • 2
    • 3

    待续…

  • 相关阅读:
    低投入,高产出的数字人直播间软件强势“出圈”,铭顺科技带你一探究竟
    airplay:实现
    Java并发-操作系统,进程,线程,并行并发?
    vue-nginx刷新404问题
    2024年,计算机相关专业还值得选择吗?
    零基础Web安全学习笔记
    ubuntu22.04 CH340/CH34x 驱动安装
    轻量级ORM库peewee的基本使用
    Mac连接U盘后怎么读取 Mac连接U盘后怎么取消只读模式
    MoneyPrinterPlus全面支持本地Ollama大模型
  • 原文地址:https://blog.csdn.net/weixin_43172531/article/details/133758260