C++ 引用

204 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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;
}