【C++入门到精通】C++入门 —— 引用、内联函数

这篇具有很好参考价值的文章主要介绍了【C++入门到精通】C++入门 —— 引用、内联函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、引用

1.引用的概念

2.引用的特性

3.常引用

4.引用的使用场景

        ⭕做参数

        ⭕做返回值

5.传值、传引用效率比较

值和引用的作为返回值类型的性能比较

6.引用和指针的区别

 引用和指针的不同点

 二、内联函数

1.内联函数的概念

2.内联函数的特性

3.宏与内联函数

宏的优缺点

🔴优点:

🔴缺点:

在C++中代替宏的方法


前言

         前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,也相信大家都掌握的不错,接下来博主将会带领大家继续学习有关C++的知识点——引用 和 内联函数。下面话不多说坐稳扶好咱们要开车了。

一、引用

1.引用的概念

        在C++中,引用是一种用于简化变量操作的概念。通过引用,可以创建一个已存在变量的别名,用于在程序中对原变量进行操作,简单来说引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。引用的使用方式是在变量声明时在其类型前加上&符号,例如:

int num = 10;
int& ref = num;// 引用声明和初始化

        在上面的例子中,ref 是对 num 的引用,它们指向同一个内存位置。因此,对 ref 的操作实际上是对 num 的操作,它们完全等价。

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

void TestRef()
{
    int a = 10;
    int& ra = a;//<====定义引用类型

    printf("%p\n", &a);
    printf("%p\n", &ra);
}

        🚨注意:引用类型必须和引用实体是同种类型的!!!

2.引用的特性

1. 引用在定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体,再不能引用其他实体
4.传递函数参数:通过引用传递函数参数,可以在函数内部修改原始变量的值,而无需进行拷贝。

3.常引用

void TestConstRef()
{
    const int a = 10;
    //int& ra = a; // 该语句编译时会出错,a为常量

    const int& ra = a;
    // int& b = 10; // 该语句编译时会出错,b为常量
    const int& b = 10;

    double d = 12.34;
    //int& rd = d; // 该语句编译时会出错,类型不同
    const int& rd = d;
}

4.引用的使用场景

        ⭕做参数

void Swap(int& left, int& right)
{
    int temp = left;
    left = right;
    right = temp;
}

        ⭕做返回值

int& Count()
{
    static int n = 0;
    n++;
    // ...  代码块
    return n;
}

🚨注意:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。

5.传值、传引用效率比较

        以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

#include <time.h>
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;
}

值和引用的作为返回值类型的性能比较

#include <time.h>
struct A{ int a[10000]; };

A a;
// 值返回
A TestFunc1() { return a;}
// 引用返回
A& TestFunc2(){ return a;}

void TestReturnByRefOrValue()
{
    // 以值作为函数的返回值类型
    size_t begin1 = clock();
    for (size_t i = 0; i < 100000; ++i)
        TestFunc1();
    size_t end1 = clock();

    // 以引用作为函数的返回值类型
    size_t begin2 = clock();
    for (size_t i = 0; i < 100000; ++i)
        TestFunc2();
    size_t end2 = clock();

    // 计算两个函数运算完成之后的时间
    cout << "TestFunc1 time:" << end1 - begin1 << endl;
    cout << "TestFunc2 time:" << end2 - begin2 << endl;
}

        通过上述代码的比较,发现传值和指针在作为传参以及返回值类型上效率相差很大。

6.引用和指针的区别

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

int main()
{
    int a = 10;
    int& ra = a;

    cout<<"&a = "<<&a<<endl;
    cout<<"&ra = "<<&ra<<endl;

    return 0;
}

  在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

int main()
{
    int a = 10;

    int& ra = a;
    ra = 20;

    int* pa = &a;
    *pa = 20;

    return 0;
}

我们来看下引用和指针的汇编代码对比
【C++入门到精通】C++入门 —— 引用、内联函数,C++,c++,开发语言

 引用和指针的不同点

🔴引用概念上定义一个变量的别名,指针存储一个变量地址。
🔴引用在定义时必须初始化,指针没有要求
🔴引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
🔴没有NULL引用,但有NULL指针
🔴在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
🔴引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

🔴有多级指针,但是没有多级引用

🔴访问实体方式不同,指针需要显式解引用,引用编译器自己处理
🔴引用比指针使用起来相对更安全

 二、内联函数

1.内联函数的概念

        以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

【C++入门到精通】C++入门 —— 引用、内联函数,C++,c++,开发语言

 如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的
调用。

2.内联函数的特性

⭕inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会
用函数体替换函数调用。

缺陷:可能会使目标文件变大

优势:少了调用开销,提高程序运行效率。

inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。

⭕inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

3.宏与内联函数

宏的优缺点

🔴优点:

        1.增强代码的复用性。 

        2.提高性能。

🔴缺点:

        1.不方便调试宏。(因为预编译阶段进行了替换)

        2.导致代码可读性差,可维护性差,容易误用。

        3.没有类型安全的检查 。

在C++中代替宏的方法

1. 常量定义换用const enum

2. 短小函数定义换用内联函数文章来源地址https://www.toymoban.com/news/detail-602782.html

到了这里,关于【C++入门到精通】C++入门 —— 引用、内联函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++:命名空间,缺省参数,函数重载,引用,内联函数

    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C++》 本篇博客作为C++知识总结,我们来认识命名空间,缺省参数,函数重载,引用,内联函数。 那么在介绍命名空间时,我们先用C++的方式打印\\\"hello world\\\"。 其中,using namespace std; 就是一种命名空间的使用。 在

    2024年02月11日
    浏览(32)
  • 【C++深入浅出】初识C++中篇(引用、内联函数)

      目录 一. 前言 二. 引用 2.1 引用的概念 2.2 引用的使用 2.3 引用的特性 2.4 常引用 2.5 引用的使用场景 2.6 传值、传引用效率比较 2.7 引用和指针的区别  三. 内联函数 3.1 内联函数的概念 3.2 内联函数的特性          上期说道,C++是在C的基础之上,容纳进去了 面向对象编程

    2024年02月12日
    浏览(29)
  • 【C++】引用、内联函数、auto关键字等

    前言:在前面我们讲解了C++入门基础的一些学习例如命名空间、缺省参数、函数重载等。今天我们将进一步的学习,跟着博主的脚步再次往前迈一步吧。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:高质量C++学习 👈 💯代码仓库:卫卫周大胖的学习日记💫 💪关注博

    2024年02月20日
    浏览(41)
  • 【C++初阶(三)】引用&内联函数&auto关键字

    目录  前言  1. 引用   1.1 引用的概念   1.2 引用的特性  1.3 引用的权限  1.4 引用的使用  1.5 引用与指针的区别 2. 内联函数 2.1  什么是内联函数 2.2  内联函数的特性  3. auto  3.1 auto简介  3.2 auto使用规则  3.3 auto不能使用的场景 4.  基于范围的for循环  4.1 范围for使用

    2024年02月08日
    浏览(47)
  • [C++] C++入门第二篇 -- 引用& -- 内联函数inline -- auto+for

      目录 1、引用 -- 1.1 引用的概念 1.2 引用特性 1.3 常引用 -- 权限问题 1.4 引用的使用场景 1.4.1 做参数 1.4.2 做返回值 注意 1.5 传值、传引用的效率比较 1.6 引用和指针的区别 2、内联函数 2.1 概念 转存失败重新上传取消​编辑转存失败重新上传取消​编辑2.2 特性 3、auto 3.1 auto简

    2024年02月15日
    浏览(39)
  • 【C++学习手札】-引用与内联函数以及C++中对const拓展详解(超详细!)

                                           食用指南:本文在有C基础的情况下食用更佳                                        🔥 这就不得不推荐此专栏了:C语言                                        🍀 内联函数前置知识 :宏函数

    2024年02月14日
    浏览(27)
  • 【C++】C++入门第二课(函数重载 | 引用 | 内联函数 | auto关键字 | 指针空值nullptr)

    目录 前言 函数重载 概念 重载函数的条件 C++支持重载函数的原理--名字修饰 引用 概念 特性 常引用(const引用) 使用场景 传值,传引用效率比较 引用和指针的区别 内联函数 概念 特性 auto(C++11) auto简介 auto的使用规则 指针空值nullptr(C++11) C++98中的指针空值 结语

    2024年04月15日
    浏览(37)
  • 【C++初阶】引用&内联函数&auto关键字&范围for循环&nullptr

    ========================================================================= 个人主页还有更多系列专栏: 小白不是程序媛 我的小仓库: Gitee C++系列专栏: C++头疼记 ========================================================================= 目录 前言 引用 概念 引用的特点 常引用  引用的使用场景 做参数  做返

    2024年02月08日
    浏览(36)
  • 开启C++之旅(下):引用、内联函数及现代特性(auto和范围for循环)

    上次介绍了:开启C++之旅(上):探索命名空间与函数特性(缺省参数和函数重载) 今天就接着进行c++入门的知识讲解 引用 不是新定义一个变量,而是给已存在 变量取了一个别名 ,编译器不会为引用变量开辟内存空间,它和它引用的变量 共用 同一块内存空间。通过引用,

    2024年01月17日
    浏览(37)
  • 【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字

    在C语言中,同名函数是不能出现在同一作用域的,但是在C++中却可以,但是要满足函数重载的规则。 那什么是函数重载呢?它的规则是什么呢? 函数重载 :是函数的一种特殊情况,C++允许在 同一作用域 中声明几个功能类似的 同名函数 ,这些同名函数的 形参列表(参数个数

    2024年04月26日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包