C++:一般情况下,设计函数的形参只需要两种形式
C++:一般情况下,设计函数的形参只需要两种形式。一,是引用形参,例如 void function (int &p_para);二,是常量引用形参,例如 void function(const int &p_para)。
它们的特点如下:
# 引用形参适用于需要改变变量数据的情况,常量引用形参适用于不需要改变对象、变量数据的情况。
# 引用形参需要对象、变量来传递值,常量引用形参则不需要,可以直接传递表达式或者函数返回值。
通过这两种方式可以涵盖所有可能需要的设计情况,而通过这种方式实现的函数设计,*可以避免通过值传递的形式造成的额外复制值的操作。*
即使是出现了突破这两种方式涵盖的需求的情况(我暂时没有想到),也只需要手动创建一个相同的变量再复制值然后传递来满足。
扩展:未来编程语言的设计选择
我希望在未来的编程语言中的函数设计的默认形式应该是类似 function(type pName),它的本质应该是常量引用传递,这样就可以接受类似表达式、函数返回值的情况;还有一种形式应该是类似 function(tag type pName),它的本质应该是引用传递,要求调用者传递对象或变量来实现可改变的值的获取。这么做就是*为了避免通过值传递的形式造成的额外复制值的操作。*
类似的情况在 C# 中可以看见,它的 tag 有 ref 和 out,后者相对前者约定不需要初始化值也不会获取该参数的值。但我认为这种分类没有很大的必要,是因为基于变量本身的设计,没有必要再通过其他的操作去限定获取地址的引用是否不能读取它的值。而是否应该读取参数的值,应该由函数名和参数名甚至是注解来表明意图,否则单纯依靠 ref 这样的标志仍然无法使调用者明白应该传入什么值,这样就可以避免编程语言通过额外的操作来限定、分类。
C++:一般情况下,设计函数的形参只需要两种形式的更多相关文章
- ListView下拉刷新及上拉更多两种状态
一.前言: 很多应用都会用到ListView,当然如果是iOS就会用UITableViewController,这两个控件在不同的OS上,功能是一样的,只是有些细微的不同(iOS的UITableVie ...
- bind()函数的深入理解及两种兼容方法分析
在JavaScript中,bind()函数仅在IE9+.Firefox4+.Chrome.Safari5.1+可得到原生支持.本文将深入探讨bind()函数并对两种兼容方法进行分析比较.由于本文将反复 ...
- Linux系统下安装jdk及环境配置(两种方法)
https://blog.csdn.net/qq_42815754/article/details/82968464 这里介绍两种linux环境下jdk的安装以及环境配置方法在windows系统安装j ...
- 查找linux系统下的端口被占用进程的两种方法 【转】
在linux下开发时,你的软件可能要使用某一个端口,或者想查找某一个端口是否被占用.需要怎么做呢??这的确是一个比较烦恼的问题,我也此为这个苦恼过.但是通过查找man手册,还是同事的交流.总结出来两种 ...
- 某些情况下调用函数为什么要在函数名前加“(void)”
我们知道,在定义函数时,加在函数名前的"void"表示该函数没有返回值.但在调用时,在函数名前加"(void)"的作用又是什么呢? 最明显的一点就是表示程序并不 ...
- React 以两种形式去创建组件 类或者函数(二)
08==>创建组件以 1类的形式 或者以 2函数的形式 09==>使用组件 在src下创建components文件夹 是放组件的 CompType.js 组件 组件开头大写(重要) Com ...
- 【Excel 4.0 函数】REGISTER 的两种形式以及VBA等效语句
形式1 REGISTER("SAMPLE.DLL", "MyFunction", "AIC") 形式1等效 VBA语句 Declare Fu ...
- MRC的下setter访问器的两种形式
// Person复合了Phone和Room // 第一种:比较合理 先判断对象形参传递的对象和原属性是否一致,不一致在释放旧值,给形参传递的值retain,因为retain方法会返回该对象,因此可以 ...
- python获取函数参数默认值的两种方法
1.使用函数的__defaults__魔术方法 demo: # coding=utf-8 def f(a,b,c=1): pass f.__defaults__ 输出结果: (1,) 2.使用insp ...
随机推荐
- vmare centos 6.8 minimal 无法上网
主机:win7 工具:vmare 11.0.0 系统:http://mirrors.163.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.i ...
- 原生JavaScript实现Ajax
var getXmlHttpRequest = function() { if (window.XMLHttpRequest) { //主流浏览器提供了XMLHttpRequest对象 return ...
- 使用ROW_NUMBER()+临时表+While 实现表遍历
declare @table table(dlid int,RowNum int)insert into @table select dlid,ROW_NUMBER() over(order by d ...
- 让“是男人就下到100层”在Android平台上跑起来
原工程:https://github.com/jeekun/DownFloors 移植后的代码:HelloCpp.zip 移植后的APK:HelloCpp.apk 说明:(cocos2d-x版本是“ ...
- hibernate整合spring事务异常
Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushM ...
- jQuery根据name取input值问题
最近做项目用$("input[name=inputName]").val();去取input值得时候发现取值有问题:总是取第一次输入的值,如果在同一个页面不发生表单提交,然后将in ...
- windows下nginx安装、配置与使用(转载)
目前国内各大门户网站已经部署了Nginx,如新浪.网易.腾讯等:国内几个重要的视频分享网站也部署了Nginx,如六房间.酷6等.新近发现Nginx 技术在国内日趋火热,越来越多的网站开始部署Nginx ...
- DIV+CSS中标签dl dt dd常用的用法
转自:http://smallpig301.blog.163.com/blog/static/9986093201010262499229/ < dl>< /dl>用来创建一个 ...
- python之线程进程协成
线程与进程 什么是线程 线程是进程一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但是它可与同属一个线程的 ...
- mysql提供dataprovider
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.Inpu ...