写出高质量的代码——“零星”总结(延续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内联函数:对于形似函数的宏,尽量使用内联函数,既能够得到宏的高效,又能够保证类型的安全。

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

用引用取代指针

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

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

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

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







本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4754458.html,如需转载请自行联系原作者


相关文章
|
5月前
|
算法 测试技术 持续交付
技术感悟:代码之外的智慧
【8月更文挑战第14天】在技术的海洋中,我们常常沉浸于代码的编写和调试,追求着更高效的算法和更优雅的解决方案。然而,技术的世界远不止于此。它还包括了对问题的理解、对工具的运用、以及与他人的协作等多个方面。这些看似与代码无关的技能,实际上对我们的技术成长有着深远的影响。本文将分享一些在代码之外的技术感悟,希望能够为大家提供一些新的视角和思考。
|
5月前
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
100 0
|
6月前
|
编译器 C语言 C++
C++从遗忘到入门问题之C++持从C语言的过渡问题如何解决
C++从遗忘到入门问题之C++持从C语言的过渡问题如何解决
|
监控 数据挖掘 项目管理
冲刺阶段 - PMP易错概念(持续更新中)(一)
冲刺阶段 - PMP易错概念(持续更新中)
102 0
|
自然语言处理 监控 数据挖掘
冲刺阶段 - PMP易错概念(持续更新中)(二)
冲刺阶段 - PMP易错概念(持续更新中)(二)
99 0
|
监控 安全 数据可视化
冲刺阶段 - PMP易错概念(持续更新中)(三)
冲刺阶段 - PMP易错概念(持续更新中)(三)
84 0
|
数据采集 监控 数据挖掘
冲刺阶段 - PMP易错概念(持续更新中)(四)
冲刺阶段 - PMP易错概念(持续更新中)(四)
111 0
|
存储 安全 搜索推荐
详解软件开发的标准过程(生命周期):跟着标准搞,设计没烦恼
详解软件开发的标准过程(生命周期):跟着标准搞,设计没烦恼
面向对象——模块的延续与发展
面向对象——模块的延续与发展
92 0
|
Rust 机器人 编译器
Rust 公布 2024 年路线图:重点涉及三个方向
Rust 公布 2024 年路线图:重点涉及三个方向
500 0

热门文章

最新文章