• 写出高质量的代码——“零星”总结(延续3)


    特别是在C++如何使用C

    C++中使用C的程序库,实现C++和C的混合编程:extern "C" { /* code */ }一定要加在C++的代码文件里才干起作用。

    //C编译器编译函数时不带函数的类型信息,仅仅包括函数符号名字。而C++编译器为了实现函数重载,在编译时会带上函数的类型信息。extern "C"的作用:告诉C++链接器寻找调用函数的符号时,採用C的方式。

    ===================================

    使用memcpy()系列函数时要足够小心【memcpy()、memset()、memcmp()】

    在C语言中,不管是内置类型,还是自己定义的结构类型(struct),其内存模型都是可知的。透明的,故能够对该对象的底层字节序列一一进行操作。

    在C++中,把C 中的数据类型叫做POD(Plain Old Data)对象(C的全部对象都是POD)。

    POD对象特性:二进制内容是能够任意复制的。

    C++标准并未对非POD对象的内存布局做不论什么定义。对于不同的编译器。其对象布局是不同的。而在C语言中,对象布局只会受究竟层硬件系统差异的影响。

    ===================================

    尽量用new/delete 取代malloc/free

    malloc与new之间的主要差别:

    1)new 是C++ 运算符,而malloc 则是C标准库函数。

    2)通过new创建的东西是具有类型的,而malloc函数返回的则是void*,须要进行强制转型。

    3)new 能够自己主动调用的构造函数。而malloc不会。

    4)new 失败时会调用 new_handler 处理函数。而malloc失败则之间返回 NULL。

    ------------------------------------

    free与delete之间的仅仅有两点差别:

    1)delete 是C++运算符,free 是C标准库函数。

    2)delete 能够自己主动调用对象的析构函数,而malloc 不会。

    针对内置函数。没有对象的构造与析构,故malloc/free 除了须要强制转型之外。和new/delete无异。

    realloc(C中又一次设置内存块的大小):C++中仅仅能先释放原来的内存,再又一次申请。

    ===================================

    尽量使用C++标准的 iostream

    1)prinf缺点:《尽量不要使用可变參数》。而C++ iostream 类型安全。可扩充性强。

    2)C中的stream长处:

    a.一般觉得C stream函数生成的可运行文件更小,效率更高。

    b.C++ stream 程序库中的类会涉及对象构造、析构的问题。而 C stream 函数没有。

    c.C stream 函数有更强的可移植能力。

    ===================================

    尽量採用C++风格的强制类型转型

    链接:reintepret_cast、static_cast、dynamic_cast、const_cast

    C++强制转型更安全、转型针对性更强。

    ===================================

    尽量用const、enum、inline替换#define<尽量把工作交给编译器而非预处理器>

    #define PI 3.1415926       //#define不属于语言自身范畴、PI符号名不会被编译器列入符号表

    const double PI  = 3.1415926;//常量属于语言层面、PI会进入符号表、常量能够避免目标码的多份复制,即生成的目标代码更小。由于预处理器会替换目标代码中全部宏PI,而常量仅仅会分配一块内存

    -----------------------------------

    定义常量的数据成员的主要目的是为了将常量的作用域限制在一个特定的类里,为了让限制常量最多仅仅有一份,还必须将该常量用static进行修饰:

    static const int NUM_LESSONS = 5;//声明唯一常量(类内初始化)(一般形式的初始化不同意放在声明里,需将其初始化放到实现文件中,该变量的定义处:const double CMath::PI = 3.1415926;/* 实现文件.cpp */)

    早期的编译器可能不接受在声明一个静态的类成员时为其赋初值。

    -----------------------------------

    假设编译器不支持类内初始化,而此时编译器又恰恰须要定义的成员常量值,借助 enum 解决。枚举类型能够冒充整数给程序使用。

    class CStudent{

    private:

      enum{ NUM_LESSONS = 5 };

      int scores[ NUM_LESSONS];  }; 

    -----------------------------------

    类内部的静态常量绝对不能使用#define来创建,#define的世界中没有域的概念,即没有不论什么封装效果。

    -----------------------------------

    C++的inline内联函数:对于形似函数的宏,尽量使用内联函数,既能够得到宏的高效,又能够保证类型的安全。

    ===================================

    用引用取代指针

    引用仅仅是其相应实体的别名,能对引用做的唯一操作是将其初始化(必须在定义时就初始化)。

    一旦初始化结束,引用就是其相应实体的还有一种叫法了。

    不占用不论什么存储空间,因为没有地址,因此不存在引用的引用、指向应用的指针或引用的阵列等的定义。

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    深度学习100问之深度学习的本质
    Docker在Windows下的安装以及Hello World
    杂谈——如何在CSDN上上传图片,并添加到自定义栏目中
    打造livecd的注意事项
    打造livecd的注意事项
    磁盘管理基础
    磁盘管理基础
    磁盘管理基础
    磁盘管理基础
    LFS资料和SSH远程登录全过程
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4754458.html
Copyright © 2020-2023  润新知