林锐C语言--高质量C/C++编程(第五六章)

林锐C语言–高质量C/C++编程(第五六章)

林锐C语言--高质量C/C++编程(第五六章)

  • 林锐C语言--高质量C/C++编程(第五六章)
    • 第五章 常量
      • 5.1 为什么需要常量
      • 5.2 const与#define的比较
      • 5.3 常量定义规则
      • 5.4 类中的常量
    • 第六章 函数设计
      • 6.1 参数的规则
      • 6.2 返回值的规则
      • 6.3 函数内部实现的规则
      • 6.4 其他建议
      • 6.5 使用断言

第五章 常量

5.1 为什么需要常量

如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦?
程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符什么意思,用户则更加不知它们从何处来、表示什么。
在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。
如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。

#define MAX 100 /* c 语言的宏常量*/
const int MAX =100; // C++语言的 const 常量
const float PI =3.14159;// C ++语言的 const 常量

5.2 const与#define的比较

const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。

  • 【规则 5-2-1】在 C++ 程序中只使用 const 常量而不使用宏常量,即 const 常量完全取代宏常量

5.3 常量定义规则

  • 【规则 5-3-1】需要对外公开的常量放在头文件中,不需要对外公开的常量在定义文件的头部。为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。
  • 【规则 5-3-2】如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不应给出一些孤立的值。例如
const float RADIUS = 100; 
const float DIAMETER = RADIUS * 2;

5.4 类中的常量

枚举常量不会占用对象的存储空间,它们在编译时被全部求值。
枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点数(如 PI=3.14159)

class A 
{.const int SIZE =100;//错误,企图在类声明中初始化 const 数据成员 int array [ SIZE ];
//错误,未知的 SIZE 
};
//const 数据成员的初始化只能在类构造函数的初始化表中进行,例如class A 
{//构造函数A ( int size );const int SIZE ;
};
//构造函数的初始化表A :: A ( int size ): SIZE ( size )
-A a (100);//对象 a 的 SIZE 值为100A b (200);//对象 b 的 SIZE 值为200

第六章 函数设计

C 语言中,函数的参数和返回值的传递方式有两种
值传递(pass by value)
指针传递(pass by pointer)。
C++ 语言中多了引用传递(pass by reference)。由于引用传递的性质象指针传递,而使用方式却象值传递。

6.1 参数的规则

  • 【规则 6-1-1】参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。如果函数没有参数,则用 void 填充
  • 【规则 6-1-2】参数命名要恰当,顺序要合理。
    void StringCopy( char *strDestination,char *strSource);
  • 【规则 6-1-3】如果参数是指针,且仅作输入用,则应在类型前加 const,以防止该指针在函数体内被意外修改
  • 【规则 6-1-4】如果输入参数以值传递的方式传递对象,则宜改用“const &”方式来传递,这样可以省去临时对象的构造和析构过程,从而提高效率
    void StringCopy(char *strDestination,const char *strSource);

6.2 返回值的规则

  • 【规则 6-2-1】不要省略返回值的类型
    C语言中,凡不加类型说明的函数,一律自动按整型处理。这样做不会有什么好处,却容易被误解为 void 类型
    C++语言有很严格的类型安全检查,不允许上述情况发生。由于C++程序可以调用C 函数,为了避免混乱,规定任何 C++/ C 函数都必须有类型。
    如果函数没有返回值,那么应声明为void类型
    如果getchar碰到文件结束标志或发生读错误,它必须返回一个标志 EOF。为了区别于正常的字符,只好将 EOF 定义为负数(通常为负 1)。因此函数getchar就成了int类型。

违反这条规则的典型代表是 C 标准库函数 getchar 。

例如:

 char c ;c = getchar ();if ( c == EOF )
...

按照getchar名字的意思,将变量c声明为 char 类型是很自然的事情。但不幸的是 getchar 的确不是 char 类型,而是 int 类型,其原型如下:
int getchar ( void );
由于 c 是 char 类型,取值范围是[-128,127],如果宏 EOF 的值在 char 的取值范围之外,那么 if 语句将总是失败,这种"危险"人们一般哪里料得到!导致本例错误的责任并不在用户,是函数 getchar 误导了使用者。

6.3 函数内部实现的规则

函数的出口入口处对参数的有效性进行检查

char * Func ( void )
{char str []=" hello world "; //str的内存位于栈上return str ; //将导致错误
}

编译器直接把临时对象创建并初始化在外部存储单元中,省去了拷贝和析构的花费,提高了效率。
3)如果函数返回值是一个对象,要考虑 return 语句的效率。例如

return String (s1+s2);

这是临时对象的语法,表示"创建一个临时对象并返回它"。不要以为它与"先创建一个部对象temp并返回它的结果"是等价的,如

 String temp (s1+s2);return temp ;

实质不然,上述代码将发生三件事。首先, temp对象被创建,同时完成初始化;然后拷贝构造函数把temp拷贝到保存返回值的外部存储单元中;最后,temp在函数结束时被销毁(调用析构函数)。然而"创建一个临时对象并返回它"的过程是不同的,编译器直接把临时对象创建并初始化在外部存储单元中,省去了拷贝和析构的化费,提高了效率。

6.4 其他建议

  • 【建议 6-4-1】函数的功能要单一,不要设计多用途的函数。
  • 【建议 6-4-2】函数体的规模要小,尽量控制在 50 行代码之内。
  • 【建议 6-4-3】尽量避免函数带有“记忆”功能。如:static

6.5 使用断言

程序一般分为 Debug 版本和 Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。
断言assert是仅在 Debug 版本起作用的宏,它用于检查“不应该”发生的情况。
而是宏。程序员可以把assert 看成一个在任何系统状态下都可以安全使用的无害测试手段。

void * memcpy ( void * pvTo , const void * pvFrom , size _ t size )assert (( pvTo != NULL )&&( pv =1
//防止改变 pvTo 的地址y * pbTo =( byte *) pvTo ;
//防止改变 pvFrom 的地址byte * pbFrom =( byte *) pvFrom ;while ( size =->0)
* pbTo ++ = *pbFrom ++;return pvTo ;

示例6-5复制不重叠的内存块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/23329.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何理解与学习数学分析——第二部分——数学分析中的基本概念——第7章——连续性

第2 部分:数学分析中的基本概念 (Concepts in Analysis) 7. 连续性(Continuity) 本章首先讨论连续性的直观概念,并介绍与早期数学中常见的函数不同的函数。解释了连续性的定义,并演示了如何使用它来证明函数在一点上连续,以及证…

支付宝推出AI毛发自测工具,上传照片即可自测脱发等级

根据国家卫健委此前公布的数据,我国超过2.5亿人有脱发困扰,平均每6人中就有1人脱发,且近些年来,脱发群体呈年轻化趋势。为了帮助应对“秃”如其来的脱发问题,今日,支付宝发布“AI毛发自测”工具&#xff0c…

Mixly UDP局域网收发数据

一、开发环境 软件:Mixly 2.0在线版 硬件:ESP32-C3(立创实战派) 固件:ESP32C3 Generic(UART) 测试工具:NetAssist V5.0.1 二、实现功能 ESP32作为wifi sta连接到路由器,连接成功之后将路由器…

代码随想录 day 30

回溯总结: 相当于暴力for循环,其目的用递归控制for循环嵌套的数量。当剪枝时,就可以使得嵌套数量减少。把回溯问题抽象一颗树比较好懂。并且使得代码更简洁。 对于组合问题,什么时候需要startIndex呢? 在一个集合求组合…

计算机网络五层模型,看不懂请你去吃宵夜

大家好,我是徒手敲代码。 今天用最通俗易懂的话,来回答计算机网络五层模型,分别负责什么。 计算机网络的五层模型自底向上分别为物理层、数据链路层、网络层、传输层和应用层,每一层都承担着特定的职责,共同确保数据…

mysql8.0中的mysql.ibd

mysql8.0版本中多了一个mysql.ibd的文件。5.7版本则没有这个文件。 MySQL5.7: .frm文件 存放表结构信息 .opt文件,记录了每个库的一些基本 信息,包括库的字符集等信息 .TRN,.TRG文件用于存放触发器的信 息内容。 在MySQL 8.0之前&#xff0…

【设计模式】适配器模式(结构型)⭐⭐⭐

文章目录 1.概念1.1 什么是适配器模式1.2 优点与缺点 2.实现方式2.1 类适配器模式2.2 对象适配器模式 3 Java 哪些地方用到了适配器模式4 Spring 哪些地方用到了适配器模式 1.概念 1.1 什么是适配器模式 简单来说,适配器模式就是作为两个不兼容接口之间的桥梁。 1.…

Qt for Android 申请摄像头权限

步骤 1. 添加用户权限 AndroidManifest.xml 中新增&#xff08;不添加后面申请选项时不弹窗&#xff09; 或者再Qt Creator中直接添加 2. Qt代码申请权限 Qt自己封装好了一些常用的权限申请&#xff0c; 详情Qt Assistant文档搜索 QPermission查看 #include <QPermi…

关于stm32的软件复位

使用软件复位的目的&#xff1a; 软件复位并不会擦除存储器中的数据&#xff0c;它只是将处理器恢复到复位状态&#xff0c;即中断使能位被清除&#xff0c;系统寄存器被重置&#xff0c;但RAM和Flash存储器中的数据保持不变。 STM32软件复位(基于库文件V3.5) &#xff0c;对…

终于搞懂了!原来vue3中template使用ref无需.value是因为这个

前言 众所周知&#xff0c;vue3的template中使用ref变量无需使用.value。还可以在事件处理器中进行赋值操作时&#xff0c;无需使用.value就可以直接修改ref变量的值&#xff0c;比如&#xff1a;<button click"msg Hello Vue3">change msg</button>。…

买视觉检测设备需要多少钱?

随着工业自动化的发展&#xff0c;其应用范围逐步提高&#xff0c;其中母子图像传感器、CMOS和CCD摄像机、DSP、ARM嵌入式技术、图像处理和模式识别技术的快速发展&#xff0c;有效地推动了视觉检测设备的发展。在机器视觉领域中&#xff0c;常见的就是视觉检测、视觉识别、视觉…

Django里choices字段使用中文使用

如果想要将下面的表格里的内容数字换成对应的内容&#xff1a; 需要更改成这样&#xff1a; 下面是步骤&#xff1a; 在 python 里的 models.py 文件里&#xff0c;创建数据表的时候&#xff0c;用到了 choices class Example(models.Model):name models.CharField(verbose…

vos3000安装外呼系统703一键安装软交换系统

关于VOS3000系统的一键安装&#xff0c;通常这类设备的安装需要遵循制造商提供的官方指南。由于VOS3000是一个专业的通信系统&#xff0c;安装过程可能涉及到硬件配置、网络设置、系统参数配置等多个步骤。以下是一般的安装步骤&#xff0c;但请注意&#xff0c;具体的安装方法…

领菲linfeeLNF96E多功能电力仪表智能数码液晶显示三相电压电流表

品牌 LINFEE 型号 LNF96E 货号 LNF96E 产地 中国大陆 省份 江苏省 地市 无锡市 装修及施工内容 安装工程 电源电路 交流电表 电表类型 多功能电度表 颜色分类 LNF96E-C,LNF96E-CM,LNF96E-CJ,LNF96E-CK,LNF96E-CJK,LNF96E-CMJK 多功能电力仪表,LNF96E三相多…

【SAP HANA 34】HANA查找函数LOCATE的使用

在SQL中通常需要查找字符串中是否包含某个字符的情况,类似与Java或者JS中的indexOf 的函数 在HANA中使用locate函数也可满足需求。 1、函数用途 查找一个子字符串(needle)在另一个字符串(haystack)中的位置。2、语法 LOCATE ( <string-expression1>, <string-…

图像的IO操作

代码&#xff1a; import cv2 as cvimport matplotlib.pyplot as plt​#读取图像img cv.imread("../data/images/zidane.jpg")​#显示图像#2.1 OpenCVcv.imshow("dili",img)cv.waitKey(0)cv.destroyAllWindows()​#2.2 matplotlibplt.imshow(img[:,:,::-…

优化你的WordPress网站:内链建设与Link Whisper Pro插件的利用

文章目录 内链的重要性WordPress SEO插件&#xff1a;Link Whisper Pro主要功能使用指南下载与安装 结语 在数字营销和网站管理领域&#xff0c;SEO内部优化是提升网站排名、增加流量和提高用户参与度的核心策略。在众多SEO技巧中&#xff0c;内链建设是构建良好网站结构和提升…

2024最新华为OD机试-C/D卷 - 在线OJ使用说明

文章目录 &#x1fa90;在线 OJ 入口&#x1f3a7;申请OD使用权限&#x1f353;在线 OJ 的使用说明OJ主界面专题系列语言支持评测结果 &#x1fa90;在线 OJ 入口 &#x1f517; 2024最新华为OD机试 - 在线OJ入 &#x1f3a7;申请OD使用权限 本专栏配套 OJ 的为了配合考友更高…

Python实现连连看7

3.3 根据地图显示图片 在获取了图片地图之后,就可以根据该图片地图显示图片了。显示图片的功能在自定义函数drawMap()中实现。 3.3.1 清除画布中的内容 在画布上显示图片之前,需要将画布中图1的启动界面内容清除,代码如下所示。 canvas.delete(all) 其中,delete()方法…

如何提升WAS存储设备管理的安全性及数据访问的流畅性?

随着企业数据飞速增长&#xff0c;越来越多的核心数据通过专业存储设备存储&#xff0c;客户对存储设备的安全性、效率和成本格外关注。其中WAS存储设备管理通常指的是对Windows Azure Storage&#xff08;WAS&#xff09;的存储设备进行管理。WAS存储设备管理存在一些弊端和不…