C++学习笔记之——引用 内联函数
本文为原创作品,转载请注明出处
欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/
作者:晨凫追风
一直想开始写C++的学习笔记,学习C++已经两个月了,今天开始写一下引用,内联函数,的一些概念和作用吧。那么开始吧!
内联函数:
我们写的程序最终都是要用编译器,进行编译链接形成一段机器可以知道的二进制代码,接着存到一个内存中,这时候每一段程序代码都会有自己的一个地址,计算机按照地址增1,依次执行这段代码,当遇到代码调用别的函数的时候,这时候就要存储目前程序执行的很多状态呀,把这些东西放入堆栈里面,然后去执行被调用的函数,执行完之后再返回原来的程序断点处继续执行。这样一来一去,就会浪费时间和一些内存。于是内联函数出现了,它就是在编译器对代码进行链接的阶段,在调用函数的位置,用调用的函数代码替换原来的函数调用,这样就不用调用来调用去,占去时间和内存。如果你的程序中有十个位置调用了内联函数,则这个函数将会在整个代码中存在十个副本。看图说话:
要用到内联函数要采取下列两个措施之一:
在函数声明前加关键字inline
在函数定义前加关键字inline
最常见的用法是定义函数和声明时一起来,
上代码;
#include<iostream>
using namespace std;
inline double square(double x) {return x * x; } int main()
{double a, b;double c = 11.0;a = square(5.0);b = square(4.5 + 7.5);cout <<"a = "<< a<< endl;cout <<" b = "<< b <<endl;cout<<"square(C++) = " << square(c++) <<endl;cout<<"now c = " <<c<< endl;
}
内联函数总结:
内联函数就是为了省去函数调用占用的一些时间和内存而出现的,当一些函数比较长时用内联函数显然不具有很大意义,执行时间远大于调用耗去的时间,所以一般情况下,如果函数定义超过多行时不太用内联函数,而且内联函数是不允许递归的。
引用
如果一个人叫“小明”它的小名叫“阿狗”,这时你喊“小明”或者“阿狗”大家都明白是它,于是呢当你打“小明”时,“阿狗”也会受伤(同一个人)。引用就是这样的,同一个变量叫两个名字,你修改一个名叫“小明”的变量后,叫“阿狗”的肯定也变了。(记住无论在哪里改它,他们总是一起改变,从一而终)。
举个例子:把int变量firstName取小名lastName;
intfirstName;
int& lastName = firstName;
取好名字之后两名字便一直依存。缠缠绵绵。开始了他和他的故事:
注意:必须在声明引用变量的时候对引用变量进行初始化。如下面:
int first Name;
int & lastName;
lastName = firstName; 不可以。。。。不可以 。。。。。不可以。。。。
引用变量有啥用呢?
函数按值传递调用过程中,修改形参,相应的实参是不会改变的,因为在调用的过程中先是拷贝那个传递过来的值,然后用这个副本进行处理。这样被调用程序就不会访问调用程序中的那个变量。
按值传递调用遇到大的结构体,复制一下,再用副本这样会占用时间,于是来一个按引用变量传递调用函数。这样相当于直接对原始的那个值进行操作。Ok不用复制,当然你也可以用指针对其进行访问,有同样的效果,就是指针用的不太明白,按照引用调用的话,只需按照按值传递调用那样调用程序就好了。
按照指针调用的话,是对指针进行复制,然后用复制的副本进行一系列的操作。
举个简单的例子:
#include<iostream>
using namespace std ;
void swapr(int &a, int &b); //按照引用传递进行调用
void swapp(int * p, int * q); //按照指针传递进行调用
void swapv(int a ,int b); //按值传递进行调用 int main()
{int wallet1 = 100;int wallet2 = 200;cout << "wallet1 = " << wallet1 <<endl;cout << "wallet2 = " << wallet2 <<endl;cout << "引用传递"<< endl;swapr(wallet1,wallet2);cout << "wallet1 = " << wallet1 <<endl;cout << "wallet2 = " << wallet2 <<endl;cout << "指针传递"<< endl;swapp(&wallet1, &wallet2);cout << "wallet1 = " << wallet1 <<endl;cout << "wallet2 = " << wallet2 <<endl;cout << "按值传递"<< endl;swapv(wallet1,wallet2);cout << "wallet1 = " << wallet1 <<endl;cout << "wallet2 = " << wallet2 <<endl;
}void swapr(int &a, int &b) //按照引用传递进行调用
{
int temp ;
temp = a;
a = b;
b = temp;
}
void swapp(int * p, int * q) //按照指针传递进行调用
{int temp ;
temp = *p;
*p = *q;
*q = temp;}
void swapv(int a ,int b) //按值传递进行调用
{
int temp ;
temp = a;
a = b;
b = temp;
}
分析下程序:
在按照引用传递进行函数调用的时候,把wallet1的引用指定为a,wallet2的引用指定为b,这样在函数中两个值互相交换,便可以修改原来的值。按值传递时只是对传递过来的副本进行交换,并没有改变原来的值,所以没有交换成功。
最后进行一下总结:
使用引用的原因:
程序员能够修改调用函数中的数据对象
通过传递引用而不是传递整个数据对象,可以提高运行速度,这一点也是指针参数存在的一个原因
下面是一些指导原则:
使用传递的值而不对原始值做修改的函数:
数据对象很小,则按值传递
数据对象是数组,使用指针(别无选择)并且将指针声明为指向const的指针
数据结构较大时,使用const指针或者const引用
数据对象是类对象,使用const引用
使用传递的值并且对原始值做修改的函数:
数据对象是内置数据类型,使用指针
数据对象是数组,使用指针
数据对象是结构,使用指针或者引用
数据对象是类结构,使用引用
C++学习笔记之——引用 内联函数相关推荐
- js学习笔记82——操作内联样式
js学习笔记82--操作内联样式 通过js修改元素的样式 查参考手册 内联样式 读取元素的样式 看如下代码 <!DOCTYPE html> <html lang="en&q ...
- C++ C++基础语法入门总结(二)引用-内联函数-C++11新特性
C++基础语法入门总结 C++引用 再谈引用和指针 C++内联函数 附加C++11新特性 auto关键字 基于范围的for循环 指针空值nullptr C++引用 引用:就是某一变量(目标)的一个别名 ...
- Python学习笔记3.2-python内置函数大全
学习python不可避免的首先要了解python的内置函数,熟悉了这些以后可以给编程带来很大的方便. 1.数学运算类 函数名 函数功能 备注 abs(x) 求绝对值 1.参数可以是整型,也可以是复数2 ...
- JS学习笔记13-操作内联样式
一.通过JS修改元素的样式 语法: 元素.style.样式名=样式值(字符串). box.style.width="300px"; 注意:如果css样式名中含有-,这种名称在JS中 ...
- MySQL学习笔记_7_MySQL常用内置函数
MySQL常用内置函数 说明: 1)可以用在SELECT/UPDATE/DELETE中,及where,orderby,having中 2)在函数里将字段名作为参数,变量的值就是字段所对应的每一行的值. ...
- [云炬python学习笔记]Numpy中内置函数min(),max(),sum()与Python中内置函数min(),max(),sum()性能对比分析
众所周知,Python有许多内置函数(例如min(),max(),sum()),Numpy也有自己的内置函数(np.min(),np.max(),np.sum()).由于Numpy的函数是在编译码中执 ...
- 步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)
一.Inline Method 概述 一个函数,其本体(method body)应该与其名称(method name)同样清楚易懂. 动机(Motivation) 以简短的函数表现动作意图,这样会使 ...
- 中谷教育Python21~24笔记——switch和内联函数
1.首先,python并没有提供switch语句 2.python可以通过字典实现switch语句的功能. 实现方法分为两步: --首先,定义一个字典 --其次,调用字典的get()获取相应的表 ...
- 【C++】引用、内联函数、函数重载、函数默认参数(缺省参数)与占位参数、extern “C“ 浅析
端午继续~ C++对C的扩展 目录 引用 普通变量名引用 对数组的引用 对指针的引用 对函数的引用 引用作为函数的参数 引用作为函数的返回类型 常引用 内联函数 函数重载 函数的默认参 ...
最新文章
- Java学习笔记--StringTokenizer的使用
- 前端 在浏览器端存储数据
- ThreadLocal小记
- 读书笔记_C#入门经典(第5版)第五章_变量的更多内容
- 可以让你少奋斗十年的工作经验
- 智能制造的灾备问题如何解决?
- 2018年10月22日-Python day1
- bzoj5017 [Snoi2017]炸弹
- linux 混杂设备 miscdevice设备介绍
- C语言的本质(2)——二进制、八进制、十六进制与十进制
- java jvm学习笔记三(class文件检验器)
- 小米5s html,小米5S线刷MIUI9系统的方法_小米5S专用的MIUI9系统刷机包
- 【历史上的今天】5 月 11 日:Dijkstra 算法开发者诞生;电子表格软件的开山鼻祖;机器狗 AIBO 问世
- DOTA双功能螯合剂127985-74-4,p-SCN-Bn-DOTA,实验室科研试剂
- 最有用的p d f 格式转换软件
- 【我上岸了】干了两年外包的我拿到阿里offer了,在此总结一下我从外包到阿里的经验吧
- FreeBSD:从内核获取其他进程的pid及cpu占用率
- vue2.0,vue3.0 v-model数据双向绑定
- php 替换表情符号,表情符号替换 – PHP
- 使用mat.at方法获取像素值
热门文章
- 【SpringMVC】从Fastjson迁移到Jackson,以及对技术选型的反思
- 利用K8S技术栈打造个人私有云(连载之:K8S资源控制)
- DOS命令大全(转)
- Android中Spinner的使用
- 简单几步教你怎么在路由器上搭建PHP环境的网站
- ActionT和FuncT委托
- hdu-2209 翻纸牌游戏
- More than one file was found with OS independent path 'lib/arm64-v8a/libsqlite.so'
- BZOJ4723[POI2017]Flappy Bird——模拟
- Linux学习总结(三)之 putty,xshell远程连接及密钥认证篇