内联函数和引用<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++入门12——详解多态1
C++入门12——详解多态1
38 2
C++入门12——详解多态1
|
1月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
79 1
|
1月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
23 0
|
1月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
26 0
|
1月前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)
|
1月前
|
编译器 Linux C语言
【C++入门(上)】—— 我与C++的不解之缘(一)
【C++入门(上)】—— 我与C++的不解之缘(一)
|
1月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
30 0
|
5天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
25 5
|
11天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
40 4
|
12天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
35 4