引用是C++对C的扩充,通过变量名来申请并命名内存空间。 重点概念: (1)引用的基本使用方法 (2)引用使用时需要注意的三件事 (3)引用数组 (4)三种传递方法 (5)引用作为返回值 (6)引用指针 (7)引用常量
注意: (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; }(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; }(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在地址传递和引用传递时,形参发生改变变量的结果也会发生改变
(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; }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; }常量引用指向自变量时,可通过改变自变量而改变常量引用
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); }