写出高质量的代码——“零星”总结(延续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月前
|
程序员 数据安全/隐私保护
编程之外,生活的美好航程
编程之外,生活的美好航程
|
2月前
|
算法 测试技术 持续交付
技术感悟:代码之外的智慧
【8月更文挑战第14天】在技术的海洋中,我们常常沉浸于代码的编写和调试,追求着更高效的算法和更优雅的解决方案。然而,技术的世界远不止于此。它还包括了对问题的理解、对工具的运用、以及与他人的协作等多个方面。这些看似与代码无关的技能,实际上对我们的技术成长有着深远的影响。本文将分享一些在代码之外的技术感悟,希望能够为大家提供一些新的视角和思考。
|
2月前
|
Python
从代码中寻找生活的启示
【8月更文挑战第31天】本文通过探索编程的哲学与生活智慧之间的联系,揭示如何从代码的逻辑和结构中汲取对日常生活的深刻理解。以一个简单的Python代码示例为起点,逐步深入探讨编程思维如何帮助我们更好地组织生活、解决问题,并最终实现个人成长。文章旨在启发读者将技术感悟应用于更广泛的人生场景,从而发现编程之外的更多可能性。
|
5月前
|
算法 程序员 开发者
探寻代码世界中的独特注释
作为开发者在编程开发中,注释是我们编写的代码中不可或缺的一部分,尽管我们常常强调清晰的代码本身就是最好的文档,但注释依然在软件开发的全生命周期中发挥着不可替代的关键作用,扮演着关键的角色,帮助我们更好地理解和维护代码。而在代码注释的海洋中,有时我们会发现一些独特而富有创意的注释,它们既有幽默感,又蕴含着智慧,或让人会心一笑,或引发深思。有些注释展现了开发者的幽默和创造力,通过有趣的文字让我们在编码过程中轻松一笑;有些注释则引发了思考,激发了我们对更好解决方案的探索和思考;还有些注释融入了文化和历史元素,为代码增添了趣味和人文关怀。代码注释不仅仅是对代码功能的解释,更是程序员与读者之间的沟通桥梁
44 1
探寻代码世界中的独特注释
|
5月前
|
C语言
【C语言】“分⽀与循环第一章:开启创新之门,探索无尽可能性的第一篇章“2
【C语言】“分⽀与循环第一章:开启创新之门,探索无尽可能性的第一篇章“2
|
5月前
|
C语言
【C语言】“分⽀与循环第一章:开启创新之门,探索无尽可能性的第一篇章“1
【C语言】“分⽀与循环第一章:开启创新之门,探索无尽可能性的第一篇章“
|
算法
简单几行代码背后的重大意义
简单几行代码背后的重大意义
自 创 日 历 (在代码里有注释讲细节)
做日历主要是要确定好第一天是星期几,然后算间隔多少天,算出具体这一天是星期几,然后把我们想打印的打印出来,把每个月的第一天定位到该在的地方。
71 0
|
JavaScript 前端开发 安全
让你写代码和写诗一样,良好的规范就是成功的一半。
随着一个项目的开发的日益庞大,参与开发的人员也越来越多,这就出现了怎么样更好的协作的问题。当然一个好的代码规范是一个项目走向成功的基石。如果在开发中每个小伙伴都各行其事,那这个项目势必会出现各种问题,导致开发效率低下,后期维护特别麻烦等诸多问题。
面向对象——模块的延续与发展
面向对象——模块的延续与发展
82 0