内联函数和引用<C++入门>(跑路人笔记1)

简介: 内联函数和引用<C++入门>(跑路人笔记)

引用

概念:


引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它 引用的变量共用同一块内存空间。


语法:类型& 引用变量名(对象名) = 引用实体;


比如一个人将一个临时使用的整形变量随便命名了个o你直呼难受你就可以通过引用来将o引用并用tmp来代替


int& tmp = o;即可


image.png


所以我们可以把tmp当做o的别名来使用


引用特性

一个变量可以有多个引用

引用一旦引用一个实体,再不能引用其他实体

值得说的是虽然我们引用表面传的是值但是其实我们真正传的是地址.

引用在定义时必须初始化

image.png


引用常数

image.png



引用不匹配类型时:

如使用int类型去引用double会怎样呢?



image.png

直接引用是不行的.


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h1NvtSJB-1652361941334)(…/…/…/AppData/Roaming/Typora/typora-user-images/image-20220511160334042.png)]


加上const就可以了并且经历的转换.


我们把这个运用到函数参数上就可以高效率的接收任意类型了.


image.png


当然这样的引用我们只有读的权限并不可写入.


话说为什么我们加入const就可以接收了呢?


这跟我们编译器的转换过程有关.


我们编译器在转换的时候会先创建一个空间来把被接受的值如上图是a,然后进行更改后再给我们的接收值(本例的ra)所以我们的ra接收的值本质上其实是一个常量, 所以要用const修饰.


可以看看ra地址的截图:


image.png


虽然引用的是a但是ra和a的地址并不相同而ra的地址其实就是常数10的地址.


使用场景


1.做参数


image.png


2.做返回值


image.png


当然这个真正的作用并不是上图,到后续会讲到的.


传值和传引用效率比较

#include<iostream>
#include <time.h>
using namespace std;
struct A { int a[10000]; };
void TestFunc1(A a) {}
void TestFunc2(A& a) {}
void TestRefAndValue()
{
  A a;
  // 以值作为函数参数
  size_t begin1 = clock();
  for (size_t i = 0; i < 10000; ++i)
    TestFunc1(a);
  size_t end1 = clock();
  // 以引用作为函数参数
  size_t begin2 = clock();
  for (size_t i = 0; i < 10000; ++i)
    TestFunc2(a);
  size_t end2 = clock();
  // 分别计算两个函数运行结束后的时间
  cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;
  cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}
int main()
{
  TestRefAndValue();
  return 0;
}

结果如下:

image.png

传引用完爆传参.

相关文章
|
1月前
|
安全 编译器 程序员
【C++初阶】C++简单入门
【C++初阶】C++简单入门
|
16天前
|
编译器 Linux C语言
C++基础入门
C++基础入门
|
30天前
|
C++ 容器
【C/C++笔记】迭代器
【C/C++笔记】迭代器
15 1
|
16天前
|
C语言 C++
C++(三)内联函数
本文介绍了C++中的内联函数概念及其与宏函数的区别。通过对比宏函数和普通函数,展示了内联函数在提高程序执行效率方面的优势。同时,详细解释了如何在C++中声明内联函数以及其适用场景,并给出了示例代码。内联函数能够减少函数调用开销,但在使用时需谨慎评估其对代码体积的影响。
|
1月前
|
存储 安全 编译器
C++入门 | auto关键字、范围for、指针空值nullptr
C++入门 | auto关键字、范围for、指针空值nullptr
49 4
|
30天前
|
存储 安全 程序员
【C/C++笔记】迭代器范围
【C/C++笔记】迭代器范围
52 0
|
1月前
|
安全 编译器 C语言
C++入门-数组
C++入门-数组
|
1月前
|
存储 编译器 程序员
C++从遗忘到入门
本文主要面向的是曾经学过、了解过C++的同学,旨在帮助这些同学唤醒C++的记忆,提升下自身的技术储备。如果之前完全没接触过C++,也可以整体了解下这门语言。
|
2天前
|
编译器 C++
C++ 类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
42 30
|
16天前
|
存储 编译器 C++
C ++初阶:类和对象(中)
C ++初阶:类和对象(中)