C++基础 (5章)知识点:引用

引用

引用是C++对C的扩充,通过变量名来申请并命名内存空间。
重点概念:
(1)引用的基本使用方法
(2)引用使用时需要注意的三件事
(3)引用数组
(4)三种传递方法
(5)引用作为返回值
(6)引用指针
(7)引用常量

5.1引用的基本使用方法

Type &ref = val;

注意:
(1)&在此式中不是求址符,而是起到标识作用
(2)必须在声明引用变量时进行初始化
(3)引用初始化之后不能改变
(4)不能有NULL引用,必须确保引用是和一块合法的存储单元关联
(5)可以建立对数组的引用

void referenced_test_5_1()
{
	int a = 10;
	int &b = a;
	cout << "a" <<a << endl;
	cout << "b" << b << endl;
	cout << "------" << endl;
	b = 100;
	cout << "a" << a << endl;
	cout << "b" << b << endl;
	cout << "------" << endl;
	int &c = a;
	int &d = b;
	cout << "a" << a << endl;
	cout << "b" << b << endl;
	cout << "c" << c << endl;
	cout << "d" << d << endl;
	cout << "------" << endl;
}

5.2引用的使用要注意哪些

(1)引用必须初始化
(2)引用初始化之后其指向的地址不能改变
(3)不能直接建立引用数组

void referenced_test_5_2()
{
	//(1)引用必须初始化
	//int& ref;   
	//(2)引用初始化之后不能进行改变
	int a, b;
	int &ref = a;
	//&ref = b;
	//(3)不能直接对数组建立引用
	//int c[20];
	//int &reff = c;
	//int &reff[20] = c;
}

5.3引用数组

void referenced_test_5_3()
{
	typedef int ArrRef[10];
	int arr[10];
	ArrRef &ref = arr;
	for (int i = 0; i < 10; i++)
	{
		arr[i] = i;
		cout << "ref[i]: " << ref[i] << endl;
	}
	cout << endl;

	int(&f)[10] = arr;
	for (int i = 0; i < 10; i++)
	{
		cout << "f[i]: " << f[i] << endl;
	}
}

5.4三种传递方式

(1)值传递

void ValueSwap(int a, int b)
{
	int temp;
	temp = b;
	b = a;
	a = temp;
}

(2)地址传递

void PointerSwap(int *a, int *b)
{
	int temp;
	temp = *b;
	*b = *a;
	*a = temp;
}

(3)引用传递

void ReferencedSwap(int &a, int &b)
{
	int temp;
	temp = b;
	b = a;
	a = temp;
}
void referenced_test_5_4()
{
	int a = 5;
	int b = 10;
	ValueSwap(a, b);
	cout << "a:" << a << " b:" << b << endl;
	a = 5;
	b = 10;
	PointerSwap(&a, &b);
	cout << "a:" << a << " b:" << b << endl;
	a = 5;
	b = 10;
	ReferencedSwap(a, b);
	cout << "a:" << a << " b:" << b << endl;
}

结果分析:

a:5 b:10
a:10 b:5
a:10 b:5

在地址传递和引用传递时,形参发生改变变量的结果也会发生改变

5.5引用作为返回值

(1)返回局部变量,方法不可取,地址会被释放,值容易丢失

int& referenced_test_5_5_1()
{
	int a = 30;
	return a;
}

(2)返回静态变量引用

int& referenced_test_5_5_2()
{
	static int a = 10;
	return a;
}
void referenced_test_5_5()
{
	cout << "局部变量引用返回" << "a:" << referenced_test_5_5_1() << endl;
	cout << "局部静态变量引用返回" << "a:" << referenced_test_5_5_2() << endl;
}

5.6指针引用

c语言中如果想改变一个指针的指向而不是它所指向的内容,函数声明一般为:

void fun(int** s)

而在c++中可以采取指针引用的方法改变指针所指向的内容:

void fun(int*& s)

下面是例子:

//指针间接修改teacher的年龄
void referenced_test_5_6_1(Teacher** teacher)
{
	*teacher = (Teacher*)malloc(sizeof(Teacher));
	(*teacher)->mAge = 300;
}
//用引用修改teacher的年龄
void referenced_test_5_6_2(Teacher*& teacher)
{
	//teacher = (Teacher*)malloc(sizeof(Teacher));
	teacher->mAge = 500;
}
void referenced_test_5_6()
{
	Teacher* teacher = NULL;
	referenced_test_5_6_1(&teacher);
	cout << "5.6.1" << "teacher->mAge:" << teacher->mAge << endl;
	referenced_test_5_6_2(teacher);
	cout << "5.6.2" << "teacher->mAge:" << teacher->mAge << endl;
}

5.7常量引用

const int& ref = 500//常量指针可直接被常数赋值
//int & ref = 500;	//不可用引用不可直接被常数赋值

常量引用指向自变量时,可通过改变自变量而改变常量引用

void referenced_test_5_7_1()
{
	int a = 1000;
	const int& aRef = a;
	//aRef = 200; 编译不通过
	a = 300;	//编译通过
	cout << "5.7.1" << endl;
	cout << "a:" << a << endl;
	cout << "aRef:" << aRef << endl;
}

本章所有代码:

#include <iostream>
using namespace std;
//5.1 认识引用
void referenced_test_5_1()
{
	int a = 10;
	int &b = a;
	cout << "a" <<a << endl;
	cout << "b" << b << endl;
	cout << "------" << endl;
	b = 100;
	cout << "a" << a << endl;
	cout << "b" << b << endl;
	cout << "------" << endl;
	int &c = a;
	int &d = b;
	cout << "a" << a << endl;
	cout << "b" << b << endl;
	cout << "c" << c << endl;
	cout << "d" << d << endl;
	cout << "------" << endl;
}

//引用的使用要注意哪些
void referenced_test_5_2()
{
	//(1)引用必须初始化
	//int& ref;   
	//(2)引用初始化之后不能进行改变
	int a, b;
	int &ref = a;
	//&ref = b;
	//(3)不能直接对数组建立引用
	//int c[20];
	//int &reff = c;
	//int &reff[20] = c;
}


//建立数组引用的方法
void referenced_test_5_3()
{
	typedef int ArrRef[10];
	int arr[10];
	ArrRef &ref = arr;
	for (int i = 0; i < 10; i++)
	{
		arr[i] = i;
		cout << "ref[i]: " << ref[i] << endl;
	}
	cout << endl;

	int(&f)[10] = arr;
	for (int i = 0; i < 10; i++)
	{
		cout << "f[i]: " << f[i] << endl;
	}
}

//5.4 三种传递方式
//(1)值传递
void ValueSwap(int a, int b)
{
	int temp;
	temp = b;
	b = a;
	a = temp;
}
//(2)地址传递
void PointerSwap(int *a, int *b)
{
	int temp;
	temp = *b;
	*b = *a;
	*a = temp;
}
//(3)引用传递
void ReferencedSwap(int &a, int &b)
{
	int temp;
	temp = b;
	b = a;
	a = temp;
}
void referenced_test_5_4()
{
	int a = 5;
	int b = 10;
	ValueSwap(a, b);
	cout << "a:" << a << " b:" << b << endl;
	a = 5;
	b = 10;
	PointerSwap(&a, &b);
	cout << "a:" << a << " b:" << b << endl;
	a = 5;
	b = 10;
	ReferencedSwap(a, b);
	cout << "a:" << a << " b:" << b << endl;

}

//5.5引用作为函数返回值 需要注意什么
//(1)返回局部变量,方法不可取,值会丢失
int& referenced_test_5_5_1()
{
	int a = 30;
	return a;
}
//(2)返回静态变量引用
int& referenced_test_5_5_2()
{
	static int a = 10;
	return a;
}
void referenced_test_5_5()
{
	cout << "局部变量引用返回" << "a:" << referenced_test_5_5_1() << endl;
	cout << "局部静态变量引用返回" << "a:" << referenced_test_5_5_2() << endl;
}
//5.6 指针引用
//c语言中如果想改变一个指针的指向而不是它所指向的内容,函数声明一般为:
//void fun(**)
//给指针变量取一个别名
int * pointer = NULL;
//int*& = pointer;

//改变指针的指向
struct Teacher {
	int mAge;
};
//指针间接修改teacher的年龄
void referenced_test_5_6_1(Teacher** teacher)
{
	*teacher = (Teacher*)malloc(sizeof(Teacher));
	(*teacher)->mAge = 300;
}
//用引用修改teacher的年龄
void referenced_test_5_6_2(Teacher*& teacher)
{
	//teacher = (Teacher*)malloc(sizeof(Teacher));
	teacher->mAge = 500;
}
void referenced_test_5_6()
{
	Teacher* teacher = NULL;
	referenced_test_5_6_1(&teacher);
	cout << "5.6.1" << "teacher->mAge:" << teacher->mAge << endl;
	referenced_test_5_6_2(teacher);
	cout << "5.6.2" << "teacher->mAge:" << teacher->mAge << endl;
}
//5.7常量引用
const int& ref = 500;
void referenced_test_5_7_1()
{
	int a = 1000;
	const int& aRef = a;
	//aRef = 200; 编译不通过
	a = 300;	//编译通过
	cout << "5.7.1" << endl;
	cout << "a:" << a << endl;
	cout << "aRef:" << aRef << endl;
}
void referenced_test_5_7_2()
{
	//不能把一个自变量赋给引用,但是可以赋给常量引用
	//int& ref = 100;
	const int& ref = 100;
}
void referenced_test_5_7()
{
	referenced_test_5_7_1();
	referenced_test_5_7_2();
}
void main()
{
	referenced_test_5_1();	//引用的基本使用方法
	referenced_test_5_2();	//引用使用时需要注意的三件事
	referenced_test_5_3();	//引用数组
	referenced_test_5_4();	//三种传递方法
	referenced_test_5_5();	//引用作为返回值需要注意什么
	referenced_test_5_6();	//引用指针
	referenced_test_5_7();  //引用常量
	while (1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值