本文已参与「新人创作礼」活动,一起开启掘金创作之路。
C++引用
引用是已定义的变量的别名,通常引用变量的主要用途是用作函数的形参;通过将引用变量作为参数,函数将使用原始值而不是副本。除指针外,引用也为函数处理大型结构提供了一种非常方便的途径
引用和指针的很类似效果很类似,但是引用还是不同于指针;其中:在声明引用时需要将其初始化,而不能像指针可以先声明后赋值
==引用在声明时需初始化==
int number=10;
int*p; // 声明指针
*p=&number; // 赋值
int& q=number; // 创建时进行初始化
==引用在初始化后不允许修改指向==
int& q=number; // 相当于添加了const修饰符 int* const p=&number;
引用作函数参数
void swap1(int* a,int* b) // 传地址
{
int temp=*a;
*a=*b;
*b=temp;
}
void swap2(int& a,int& b) // 传引用
{
int temp=;
a=b;
b=temp;
}
// 上述使用的效果一致,都成功交换了a b的值,但是相对来说,传引用更方便
引用作函数返回值
如果函数的返回值是引用,这个函数调用可以作为左值
同理:如果函数的返回值是指针,这个函数调用也可以作为左值
#include <iostream>
using namespace std;
int& f() // 引用作返回值
{
static int a=10; // 静态变量存储在全局区,在程序结束时会自动释放
return a;
}
int* f1() // 指针做返回值
{
static int b=20;
return &b;
}
int main(void)
{
int& n=f();
cout << n << endl;
cout << n << endl;
f()=100; // 尝试作为左值使用
cout << n << endl;
cout << n << endl;
int* p=f1();
cout << *p << endl;
cout << *p << endl;
*f1()=200; // 尝试作为左值使用
cout << *p << endl;
cout << *p << endl;
return 0;
}
常量引用
int& q=10; // 会产生错误
const int& q=10; // 编译器会自动生成一块合法的临时空间存放10 --> int temp=10; const int& q=temp;
函数调用
如果函数调用的参数不是左值或与相应的const引用参数的类型不匹配,则C++将创建类型正确的匿名变量,将函数调用的参数的值传递给该匿名变量,并让参数来引用该变量
==在函数调用中使用引用参数应尽可能使用const修饰参数==
- 使用const可以避免无意中修改数据的编程错误
- 使用const是函数能够处理const和非const实参,否则只能接受非const数据
- 使用const引用使函数能够正确生成并使用临时变量
void print(const int& q)
{
// q=200; 出现错误
cout << q <<endl;
}
int main(void)
{
int a=100;
print(a); // 输出100
return 0;
}