条款1主要讲解指针引用的使用时机:
结论是:当你知道你需要指向某个东西,而且绝对不会改变指向其他东西,或者当你实现一个操作符儿语法需求无法由pointer实现,应该选择reference,其他任何时候都应该选择pointer。
引用:给变量起别名。
语法:数据类型&别名 = 原名
int main() {
int a = 10;
int &b = a; //此处引用之后,a,b均指向同一个内存地址 之后b不可以更改指向,引用的底层原理就是一个指针常量 int * const b = &a; 指针常量是指针指向不可以修改,但是数值可以修改,这也解释为什么引用不可以更改指向
cout << "b = " << b << endl; //10
b = 100; //等同于 *b = 100
cout << "a = " << a << endl; //100
cout << "b = " << b << endl; //100\
int c = 200;
b = c; //这是赋值操作,不是更改引用 ,经过这条语句之后 b = 200,a = 200
system("pause");
return 0;
}
引用使用的注意事项:引用使用之前必须初始化,初始化之后不可以更改。 错误用法:int &b; 没有初始化。
引用做函数返回值:
#include<iostream>
using namespace std;
//引用做函数返回值时注意事项:
//1/不要返回局部变量引用
//返回局部变量引用 (不允许)
int& test01() {
int a = 10;
return a;
}
//返回静态变量引用(允许)
int& test02() {
static int a = 10;
return a;
}
int main() {
错误用法1 不要返回局部变量引用
//int& b = test01();
//cout << b << endl; //10
//cout << b << endl; //乱码
//cout << b << endl; //乱码
//允许返回静态变量引用
int& b = test02();
cout << b << endl;
//如果函数做左值(在等式左边),必须返回引用。
int& b = test02();
cout << b << endl; //10
cout << b << endl; //10
cout << b << endl; //10
test02() = 1000;
cout << b << endl; //1000
cout << b << endl; //1000
cout << b << endl; //1000
system("pause");
return 0;
}
常量引用:
//引用使用的场景,通常用来修饰形参
void showValue(const int& v) {
//v += 10; //不允许修改 常量引用
cout << v << endl;
}
int main() {
//int& ref = 10; 引用本身需要一个合法的内存空间,因此这行错误
//加入const就可以了,编译器优化代码,int temp = 10; const int& ref = temp;
const int& ref = 10;
//ref = 100; //加入const后不可以修改变量
cout << ref << endl;
//函数中利用常量引用防止误操作修改实参
int a = 10;
showValue(a);
system("pause");
return 0;
}