文章目录
- 一、C++中的引用
- (一)引用
- 1. 语法格式
- 2. 作用
- 3. 注意事项
- (二)常引用
- 2. 其他场景
- (三)引用和函数结合使用
- 1. 引用可以作为函数的参数
- 2. 引用可以作为函数的返回值
- (四)引用和指针的区别
- 二、C++中的动态内存分配
- (一)
- (二)malloc/free和new/delete
- (三)使用示例
一、C++中的引用
引用是对引用目标起别名,类似于Linux中的硬链接;
(一)引用
1. 语法格式
数据类型 &引用名 = 引用目标;
eg: int &a1 = a;
- 注:
&
是一个引用的标识;&
在引用中使用表示的是引用的一个标识;
在两个操作数之间使用表示按位与(a & b
);
在其他场合下表示取地址(&a
)
2. 作用
节省内存开销:在给函数传递参数时,形参需要额外的开辟空间,但是使用引用后就可以节省形参的空间
不使用引用:
int func(int a,int b){
cout << "a="<<a<<" b="<<b<<endl;
cout << "&a="<<&a<<" &b="<<b<<endl;
return a+b;
}
int main(){
int a = 5,b=10;
cout << "a="<<a<<" b="<<b<<endl;
cout << "&a="<<&a<<" &b="<<b<<endl;
cout << "--------------------"<<endl;
func(a,b);
}
从下面运行结果可知,形参会分配新的内存空间
使用引用:
int func(int &a,int &b){
cout << "a="<<a<<" b="<<b<<endl;
cout << "&a="<<&a<<" &b="<<b<<endl;
return a+b;
}
int main(){
int a = 5,b=10;
cout << "a="<<a<<" b="<<b<<endl;
cout << "&a="<<&a<<" &b="<<b<<endl;
cout << "--------------------"<<endl;
func(a,b);
}
从下面结果可知,使用引用后,并未给形参分配新的内存空间
3. 注意事项
- 引用在定义时必须要有引用的目标
- 引用的数据类型 和 引用的目标的数据类型 必须保持一致
- 引用目标一旦绑定不可修改
int a = 5;
int &a1 = a;
int b = 10;
a1 = b;//这种写法是简单的赋值操作,而非修改绑定目标
(二)常引用
用const修饰的引用是一个常引用,以下两种使用均可以
const 数据类型 &引用名 = 引用目标;
数据类型 const &引用名 = 引用目标;
常引用不能通过引用来修改引用目标的值,可以通过引用目标自身进行修改。
int a=111;
int &a1=a;
a1=222;//此时就会报错
- 注:以下写法是错误的:
数据类型 &const 引用名 = 引用目标;
因为引用一旦绑定,后续无法修改。
2. 其他场景
- 普通引用不能修饰常量,只有常引用可以修饰常量;
int &a=100; //报错
const int &b=100;
- 普通引用不能修饰临时值,常引用可以修饰临时值
int x=10;
int &a = 5+x;
const int &b=5+x;
(三)引用和函数结合使用
1. 引用可以作为函数的参数
两个数交换位置,传值、传地址、传引用的区别
#include <iostream>
using namespace std;
int swap1(int a,int b){
int temp=a;
a=b;
b=temp;
}
int swap2(int *a,int *b){
int temp=*a;
*a=*b;
*b=temp;
}
int swap3(int &a,int &b){
int temp=a;
a=b;
b=temp;
}
int main(){
int a=100,b=200;
swap1(a,b);//传值
cout<<"a="<<a<<" b="<<b<<endl;
swap2(&a,&b);//传地址
cout<<"a="<<a<<" b="<<b<<endl;
swap3(a,b);//传引用
cout<<"a="<<a<<" b="<<b<<endl;
}
在实际开发中,采用哪种方法根据实际需求决定
2. 引用可以作为函数的返回值
格式:
数据类型& 函数名(形参表){
函数体;
}
- 注:
- 引用不可返回局部变量;可以返回全局变量或者使用static修饰的变量
- 常见的函数返回值是一个右值,引用作为返回值是一个左值。
(四)引用和指针的区别
二、C++中的动态内存分配
(一)
C++仍然支持malloc/free操作,但是一般在C++中使用new/delete
(二)malloc/free和new/delete
(三)使用示例
要求:从堆区申请一块连续空间,在终端上输入学生成绩,并求出成绩的最高分和最低分,以及成绩之和