c++中函数的参数传递,内联函数和默认实参的理解
1.参数传递
1)函数调用时,c++中有三种传递方法:值传递、指针传递、引用传递。
给函数传递参数,遵循变量初始化规则。非引用类型的形参一相应的实参的副本初始化。对(非引用)形参的任何修改仅作用域局部副本,并不影响实参本身。
为了避免传递副本的开销,可将形参指定为引用类型。对引用形参的任何修改会直接影响实参本身。应将不需要修改实参的引用形参定义为const引用。
2)引用作为参数的特点:
a.传递引用给函数,被掉函数的形参作为原来主调函数中的实参变量或对象的一个别名使用,所以被调函数中对形参变量的操作就是对其相应的目标对象(主调函数)的操作。
b.使用引用传递函数的参数,在内存中并没有产生实参的副本,他是直接对实参操作。而使用一般变量传递函数的参数,当发生函数调用时需要给参数分配存储单元,形参变量是实参变量的副本。如果传递的是对象,还将调用拷贝构造函数。所以传输数据较大时,使用引用比一般变量传递参数的效率和所占空间都好。
c.使用指针作为函数的参数能达到引用的效果,但是,在被调用函数中同样要给形参分配存储单元,且需要重复使用“*指针变量名”的形式进行运算,容易产生错误且阅读性较差。另一f方面,在主调函数的调用点处,必须用变量的地址作为实参,而引用更加容易使用,清晰。
2.内联函数
内联函数,一般用inline修饰。
1)成员函数称为内联。在类中成员函数全部默认为内联函数。在类中声明的成员函数如果加了inline,则其为内联函数,如果没有加inline,在类外定义该成员函数时加了inline,该成员函数也为内联函数。
2)普通函数称为内联函数。在普通函数的定义或申明前加inline使其成为内联函数。通常编译时,调用内联函数的地方,将不进行函数调用,而是使用函数体替换调用处的函数名。
形式类似宏替换(内联扩展)
3)内联机制适用于优化小的,只有几行而且经常被调用的函数(大多数编译器支持 递归函数的内联)
3.默认参数
1)默认参数只在函数声明中设定一次。只有在无函数声明时,才可以在函数定义中设定。
2)默认参数的顺序自右向左,即一个参数设定了默认值时,其右边的参数都要有默认值
3)默认参数调用时,遵循参数调用顺序,自左向右逐个调用(与第2点分清楚)
4).宏定义和内联函数的区别:宏定义是在预处理阶段进行代码替换,而内联函数是在编译阶段插入代码。宏定义没有类型检查,内联函数有类型检查。
c++中函数的参数传递,内联函数和默认实参的理解的更多相关文章
- volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域
1.volatile: 要求参数修改每次都从内存中的读取.这种情况要比普通运行的变量需要的时间长. 当设置了成按照C99标准运行之后,使用volatile变量之后的程序运行的时间将比register的 ...
- (inline)内联函数在IOS开发中的使用
今天在阅读YYKit源码(https://github.com/ibireme/YYKit.git)时发现在YYKitMacro.h组件中大量使用的内联函数,例如此文件中的一个函数 static in ...
- 内联函数 —— C 中关键字 inline 用法解析
一.什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗. 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放 ...
- JAVA中的内联函数
在说内联函数之前,先说说函数的调用过程. 调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到 转去执行该函数前的地方.这种转移操作要求在转去前要保护 ...
- C++中内联函数
目录 什么是内联函数 如何使函数内联 为什么要使用内联函数 inline函数的优缺点分析 什么时候该使用内联函数 正文 在C语言中,我们使用宏定义函数这种借助编译器的优化技术来减少程序的执行时间,那么 ...
- C语言中宏定义与C++中的内联函数
一,宏定义:在预处理的时候把宏定义的内容替换到代码中,正常编译. 1,无参数宏定义和有参数宏定义 (1)宏定义不能加分号,比如:#define PI 3.24;错的,#define PI 3.24 ...
- 07 c++中的内联函数inline
文章链接: 问题描述:类中成员函数缺省默认是内联的,如果在类定义时就在类内给出函数定义,那当然最好.如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上 inline,否则就认为不是内联 ...
- 【转载】内联函数 —— C 中关键字 inline 用法解析
转载地址:https://blog.csdn.net/zqixiao_09/article/details/50877383 一.什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈, ...
- C++中的内联函数分析
1,本节课学习 C++ 中才引入的新的概念,内联函数: 2,常量与宏回顾: 1,C++ 中的 const 常量可以替代宏常数定义,如: 1,const int A = 3; <==> #d ...
随机推荐
- day8.登陆注册简单实现
username = input('请输入注册的用户名:') password = input('请输入注册名的密码:') with open('list_of_info',mode='w',enco ...
- css3实现旋转表
如图所示: css部分: <style> #clock{width:100px; height:100px; border-radius:50%; border:4px solid bla ...
- easyui 信息提示
/*消息提示begin*/jQuery.Info = function (msg) { $.messager.alert("温馨提示", msg, "info" ...
- Raspberry Camera详解+picamera库+Opencv控制
使用树莓派的摄像头,将树莓派自身提供的picamera的API数据转换为Python Oencv可用图像数据: # import the necessary packages from picamer ...
- Java版本翻转字符串
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1282题目描述: Java中的StringBuilder有一个字符串翻转函数,因此,可以先将输入的数字转 ...
- 【python】进程与线程
No1: 多进程 from multiprocessing import Process import os # 子进程要执行的代码 def run_proc(name): print('Run ch ...
- 【nodejs】--express的中间件multer实现图片文件上传--【XUEBIG】
Multer是nodejs中处理multipart/form-data数据格式(主要用在上传功能中)的中间件.该中间件不处理multipart/form-data数据格式以外的任何形式的数据 Tips ...
- Jenkins环境搭建(3)-配置自动发送邮件
紧接上一篇博文继续来完善Jenkins自动构建环境的搭建,今天来分享下配置邮件,构建任务后,自动发送邮件到指定邮箱 配置邮件分为两部分,第一部分是在系统管理中的系统设置中配置,第二部分是在任务中配置 ...
- (Zero XOR Subset)-less-线性基
(Zero XOR Subset)-less 题意 :把n个数分成多个集合,要求 不能有集合为空,最终不能有非空子集合异或值为0,尽可能划分的多一些. 思路 :非法情况就只有 n个数异或 为0,其他的 ...
- 自己总结的C#编码规范--2.命名选择篇
上一篇文章讲了标识符命名的约定,今天讲下标识符命名的选择. 简单的讲,看到一个标识符一定要可以见名知意. 名字一定要能够表达出标识符的含意 标识符名字必须要表达出该标识符的意义,绝对不可以使用无意义的 ...