一、引用
引用的背景
引用是对c++的一个非常重要的扩充,用于参数和返回值,无需再考虑值传递和地址传递的问题.
引用的概念
相当于给变量起个别名,但不会给引用分配内存空间.
引用的定义
定义格式:数据类型 &引用名 = 引用的目标;
引用的注意事项
定义时需初始化. 目标确定不能改, 一人可以多别名,多重身份同内存
引用作为函数参数
1).引用作为函数参数,传递的是实参本身,本质上是地址传递
2).相比于普通变量和指针做形参,传递效率更高
引用作为函数的返回值
引用作为函数的返回值是一个左值
普通函数的返回值是一个右值,只可读,不可写,
指针函数的返回值是一个左值
指针与引用的区别(笔试面试)
1> 指针记录的是变量的地址,而引用变量本身
2> 定义引用时必须初始化,而定义指针不是必须初始化
3> 指针需要分配8字节的内存空间,而引用与目标是同一内存空间,无需额外分配
4> 指针可以有多级指针,但是引用只有一级引用
5> 指针后期可以更改指向,而引用一旦绑定后期就不能进行更改目标了
6> const修饰指针时,有修饰指向和值,而const修饰引用时,只有修饰值
7> 指针使用时,需要使用取值运算符进行解引用,而引用使用时跟目标的使用方式一致
8> 没有引用数组,但是有数组引用
二、C++中的动态内存分配和回收
单个内存的申请和释放 例如:int *p1 = new int; //在堆区申请一个int大小空间的内存 delete p1;
连续内存空间的申请和释放 例如:int *p1 = new int[5]; //在堆区申请5个int大小的恐惧 delete []p1;
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;
}