当前位置: 首页 > news >正文

重读金典------高质量C编程指南(林锐)-------第六章 函数设计

函数设计最重要的无外乎两个方面,一个是函数的接口设计一个是内部实现的一些规则。

在C语言中,函数的参数和返回值的传递方式分为两种: 值传递与指针传递。而C++中,多了一个引用传递。

引用传递有些像指针传递,但使用方式却像值传递。

6.1   参数的规则

规则:参数的书写要规范,不用丢三落四。

image

规则:参数命名要恰当,顺序要合理。

比如说,拷贝函数,一般是目的参数放前面,源参数放在后面。

一般,我们这样写

void  StringCopy(char *strDestiantion,  char *strSource);

StringCopy(str,  “hello world”);

规则:如果参数是指针,且仅当做输入用,则应该在前面加上const  ,以防止该指针在函数体内被意外修改。

void StringCopy(char *strDestination, const char *strSource);

规则:如果输入的参数以值传递的方式传递对象,我们可以改为 const &, 这样可以省去临时对象的构造与析构。

规则:函数参数最好控制在5个左右,不用太多。

规则:尽量不要使用类型与数目不确定的参数。

6.2   返回值的规则

规则:不要省略返回值的类型,没有返回值的,要加上void。

规则:函数类型与返回值在语义上不可冲突。

       int  getchar(void); //此函数就严格违反了上述规定。

规则:不要将正常值与错误标识混在一起返回。正常值用输出参数获得,而错误标识用return语句返回。

对于栈空间与堆空间的理解

     本人认为,堆空间里面分配的内存,只要你不手动释放,它是一种占用着内存的。有时候会造成内存的泄露。而栈空间里面分配的变量,随着函数调用的结束,自动释放空间和销毁。

     那些全局变量等全部放在了全局变量区。剩下的代码放在了代码区/数据区。

6.3   函数内部实现的规则

规则:在函数体的入口处,对参数的有效性进行检查。

规则:return语句不可返回指向 栈内存 的指针或者引用。因为该内存函数体结束时被自动销毁

image

规则:要搞清楚返回的究竟是  值 、 指针、  还是引用。

规则:如果函数返回值是一个对象,要考虑return语句的效率。

6.4   其他建议

规则:设计的函数功能要单一,函数体的规模要小,不用超过50行,尽量少用static局部变量,除非必需。

规则:要检查各个输入参数、函数体内部变量的有效性。用于出错的返回值一定要清楚,让使用者不容易忽视或误解错误情况。

6.5   使用断言

image

 

6.6    引用与指针的比较

引用: int n;   int &m = n;  相当于给n起了一个别名。对m的任何操作都会对n进行操作。

引用的一些规则:创建的同时必须初始化。(指针则可以在任何时候被初始化)

不能有NULL引用,引用必须和合法的存储单元关联(指针则可以为NULL)

一旦引用被初始化,就不能改变和引用对象的关系(指针则可以随时改变所指向的对象)

image

 

转载于:https://www.cnblogs.com/zhuxuekui/p/3587360.html

相关文章:

  • Oracle 修改表列属性
  • CKEditor如何统计文字数量
  • Oracle 11G创建表空间、用户、授权命令(Oracle 11g使用)
  • TIMESTAMP with ****问题连不上mysql
  • window.location.href的一种用法
  • StringBuffer 用法
  • 创建本地CM 离线服务器
  • mysql 每日简单备份和定期删除
  • 无法远程连接 MySQL 的解决方法
  • IOS UISearchDisplayController 点击搜索出现黑条问题解决方案
  • Python进阶07 函数对象
  • 为文本数据创建索引
  • haproxy配置文档说明
  • Android中 android:layout_weight 属性 完美解释
  • C#中的字段,常量,属性与方法
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【391天】每日项目总结系列128(2018.03.03)
  • Android优雅地处理按钮重复点击
  • iOS 颜色设置看我就够了
  • JavaScript设计模式系列一:工厂模式
  • java第三方包学习之lombok
  • Laravel Mix运行时关于es2015报错解决方案
  • Travix是如何部署应用程序到Kubernetes上的
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 复习Javascript专题(四):js中的深浅拷贝
  • 前端相关框架总和
  • 我看到的前端
  • 异常机制详解
  • 智能合约Solidity教程-事件和日志(一)
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • #{}和${}的区别是什么 -- java面试
  • #etcd#安装时出错
  • #Z2294. 打印树的直径
  • #微信小程序:微信小程序常见的配置传旨
  • (1)Android开发优化---------UI优化
  • (8)STL算法之替换
  • (c语言)strcpy函数用法
  • (C语言)球球大作战
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot教学评价 毕业设计 641310
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (一)基于IDEA的JAVA基础10
  • (转)http协议
  • (转)Unity3DUnity3D在android下调试
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Mobi域名介绍
  • .net Application的目录
  • .NET MVC 验证码
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET精简框架的“无法找到资源程序集”异常释疑