C++:引用和函数重载

一、引用

引用的背景

引用是对c++的一个非常重要的扩充,用于参数和返回值,无需再考虑值传递和地址传递的问题.

引用的概念

相当于给变量起个别名,但不会给引用分配内存空间.

引用的定义

定义格式:数据类型 &引用名 = 引用的目标;

引用的注意事项

定义时需初始化.  目标确定不能改,  一人可以多别名,多重身份同内存

引用作为函数参数

 1).引用作为函数参数,传递的是实参本身,本质上是地址传递

 2).相比于普通变量和指针做形参,传递效率更高

引用作为函数的返回值

引用作为函数的返回值是一个左值

普通函数的返回值是一个右值,只可读,不可写,

指针函数的返回值是一个左值

指针与引用的区别(笔试面试)

1> 指针记录的是变量的地址,而引用变量本身

2> 定义引用时必须初始化,而定义指针不是必须初始化

3> 指针需要分配8字节的内存空间,而引用与目标是同一内存空间,无需额外分配

4> 指针可以有多级指针,但是引用只有一级引用

5> 指针后期可以更改指向,而引用一旦绑定后期就不能进行更改目标了

6> const修饰指针时,有修饰指向和值,而const修饰引用时,只有修饰值

7> 指针使用时,需要使用取值运算符进行解引用,而引用使用时跟目标的使用方式一致

8> 没有引用数组,但是有数组引用

二、C++中的动态内存分配和回收

  1. 单个内存的申请和释放  例如:int *p1 = new int; //在堆区申请一个int大小空间的内存                                                     delete p1;

  2. 连续内存空间的申请和释放 例如:int *p1 = new int[5]; //在堆区申请5个int大小的恐惧                                                           delete []p1;

  3. new\delete与malloc\free的区别(笔试面试题)

    1> new申请空间时,可以给堆区空间进行初始化,而malloc申请时不能进行初始化

    2> new\delete是关键字,而malloc\free是库函数

    3> new申请空间时以数据类型为单位,而malloc申请空间时以字节为单位

    4> new申请的空间返回的结果申请类型的指针,而malloc申请空间时返回void*类型,       需要进行强转后使用

    5> new申请空间时会调用构造函数,malloc不会

    6> delete释放空间时,会调用析构函数,free不会

    7> new、delete申请释放空间时,区分单个还是连续空间,而malloc不区分

三、C++对C的函数部分的扩充

函数重载

在同一作用域下,可以定义多个同名的函数,但是要求参数列表必须不同

函数重载的要求

1、函数名相同

2、形参列表必须不同:可以是参数个数不同、参数类型不同

3、作用域也要相同

4、跟返回值没有关系

哑元

1、哑元参数只起到占位作用,没有实质性的用途,某个形参只有类型名,没有形参名,在函数体内也不使用该形参

2、在运算符重载时,进行区分自增自减运算符的前置和后置时,必须使用哑元完成

内联函数(inline)

1> C++中,允许定义内联函数,内联函数会建议编译器在编译程序的时候,将内联函数在调用处进行展开,运行时直接执行函数体内容,提高函数调用效率

2> 使用要求:要求函数体调用频繁,并且函数体内容较小,递归函数不允许定义成内联函数

3> 内联函数定义格式:在定义函数前加关键字inline即可

1> 思维导图

2> 封装一个结构体,结构体中包含一个私有数组,用来存放学生的成绩,包含一个私有变量,用来记录学生个数

提供一个公有成员函数,void setNum(int num)用于设置学生个数

提供一个公有成员函数:void input(),用来对所有学生的成绩进行输入工作

提供一个公有成员函数:void sort(),用来实现对存储的学生成绩进行降序排序

提供一个公有的成员函数:void show(),用于将所有学生的成绩展示出来

在主程序中,完成相关函数的调用

#include <iostream>

using namespace std;

//定义一个学生结构体
struct Student
{
private:
    int num;
    int *score;//学生个数
public:
    //设置学生个数
    void setNum()
    {
        cout<<"请输入学生个数:";
        cin>>num;
        score=new int[num];    //申请空间
    }
    //成绩输入
    void input()
    {
        printf("请输入学生成绩:");
        for(int i=0;i<num;i++)
        {
            scanf("%d",&score[i]);
        }

    }
    //根据成绩降序排序
    void sort()
    {
        for(int i=1;i<num;i++)
        {
            for(int j=0;j<num-i;j++)
            {
                if(score[j]<score[j+1])
                {
                    int temp=score[j];
                    score[j]=score[j+1];
                    score[j+1]=temp;
                }

            }

        }
        cout<<"排序成功\n";
    };
    //展示成绩
    void show()
    {
        cout<<"学生成绩为:";
        for(int i=0;i<num;i++)
        {
            cout<<score[i]<<"     ";
        }
        cout<<endl;
    }
    //释放
    void delete_stu()
    {
        delete []score;
    }
};
int main()
{
    struct Student p1;

    p1.setNum();
    p1.input();
    p1.sort();
    p1.show();
    p1. delete_stu();
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值