1

C++引用

C++引用

引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字,一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。

  • C++引用vs指针
    引用很容易与指针混淆,它们之间有三个主要区别:
    • 不存在空引用,引用必须连接到一块合法的内存
    • 一旦引用被初始化为一个对象,就不能被指向到另一个对象,指针可以在任何时候指向到另一个对象
    • 引用必须在创建时被初始化。指针可以在任何时候被初始化。
  • C++中创建引用
    试想变量名称是变量附属在内存位置中的标签,可以把引用当初是变量附属在内存位置中的第二个标签。因此,可以通过原始变量名称或引用来访问变量的内容:例如:
int i = 17;
double d = 23.5;

可以为d和i声明引用变量,如下:

int& r= i;
double& s=d;

在这些声明中,&读作引用。因此,第一个声明可以读作是r是一个初始化为i的整型引用

实例:

#include <iostream>
using namespace std;
int main(){
	int i;//声明变量
	double d;
	int& r = i;//声明引用变量
	double &s= d;
	i = 5;
	cout<<"Value of i:"<<i<<endl;
	cout<<"Value of i reference:"<<r<<endl;
	d = 11.7;
	cout<<"Value of d:"<<d<<endl;
	cout<<"Value of d reference:"<<s<<endl;
	return 0;

}

结果显示:

引用通常用于函数参数列表和函数返回值,下面列出了两个与C++引用相关的重要概念。

概念 描述
把引用作为参数 C++支持把引用作为参数传给函数,这比传一般的参数更安全
把引用作为返回值 可以从C++函数汇总返回引用,就像返回其他数据类型一样

C++把引用作为参数

使用引用来实现引用调用函数。
实例:

#include<iostream>
using namespace std;
void swap(int &x, int &y);//函数声明
int main(){
	//局部变量声明
	int a = 100;
	int b = 200;
	cout<<"before exchange, the value a:"<<a<<endl;
	cout<<"before exchange, the value b:"<<b<<endl;
	swap(a, b);
	cout<<"after exchange, the value a:"<<a<<endl;
	cout<<"after exchange, the value b:"<<b<<endl;
	return 0;
}

void swap(int &x, int& y){
	int temp;
	temp = x;
	x = y;
	y = temp;
	return ;
}

C++把引用作为返回值

通过使用引用替代指针,会使用C++程序更容易阅读和维护。C++函数可以返回一个引用,方式与返回一个指针类似。当函数返回一个引用时,则返回一个指向返回值的隐式指针。这样,函数就可以放在赋值语句的左边。
实例:

#include<iostream>
#include<ctime>
using namespace std;
double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0};
double& setValues(int i){
	return vals[i];//返回第i个元素的引用
}

int main(){
	cout<<"before change:"<<endl;
	for(int i = 0; i<5; i++){
		cout<<"vals["<<i<<"]=";
		cout<< vals[i]<<endl;
	}
	
	setValues(1) = 20.3;
	setValues(2) = 70.8;
	cout<<"after change:"<<endl;
	for(int i= 0;i<5;i++){
		cout<<"vals["<<i<<"]=";
		cout<<vals[i]<<endl;
	}
	return 0;
}

结果显示:

当返回一个引用时,要注意被引用的对象不能超出作用域。所以返回一个对局部变量的引用是不合法的,但是,可以返回一个对静态变量的引用。

int& func(){
  int q;
  //return q; //在编译时发生错误
  static int x;
  return x;//安全,x在函数作用域外依然是有效的
}

posted @ 2023-10-28 15:14  Bonne_chance  阅读(40)  评论(0)    收藏  举报
1