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 ...
随机推荐
- ArcGIS Engine 10.x许可代码
相比9.3,10.x许可代码的书写改变了,ArcObjects SDK 10 Microsoft .NET Framework 帮助文档中,提供了以下两种方式: 1. Calling RuntimeM ...
- Migrating your code from 9.3 to 10.x
刚发现ArcGIS Objects SDK提供了一个代码升级分析工具,用于辅助将程序从9.3升级到10.X:ArcGIS Code Migration Analyzer. 安装sdk后,在vs2010 ...
- tmux 安装
安装libevent wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz tar xzv ...
- ubuntu系统查看已安装的软件
1.查看安装的所有软件 dpkg -l 例如:dpkg -l | grep ftp 2.查看软件安装的路径 dpkg -L | grep ftp 也可以用 whereis ftp 3.查看软件版本 a ...
- 删除Docker中所有已停止的容器
方法一: #显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID, sudo docker ps -a|grep Exited|awk '{print $1}' #查询所有的容器,过滤出E ...
- 麒麟Kylin
开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(MOLAP)能力以支持超大规模数据,能在亚秒内查询巨大的Hive表: Kylin的主要特点包括支持SQL接口.支持超大 ...
- JavaSE | IO流
java.io.File类(文件和目录路径名的抽象表示形式) 如果希望在程序中操作文件和目录都可以通过File类来完成,File类能新建.删除.重命名文件和目录. File类是文件或目录的路径,而不是 ...
- 用 threading 写多线程服务器
import socket import threading server = socket.socket() server.bind(("127.0.0.1",8899)) se ...
- CentOS 通过yum在线安装MySQL5.7
CentOS 通过yum在线安装MySQL5.7 Step1: 检测系统是否自带安装mysql # yum list installed | grep mysql Step2: 删除系统自带的mysq ...
- 一个小demo 实用selenium 抓取淘宝搜索页面内的产品内容
废话少说,上代码 #conding:utf-8 import re from selenium import webdriver from selenium.webdriver.common.by i ...