引用
引用是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);
}