引用
引用就是一个目标的别名, 就像水浒传里面每个人都有一个外号, 比如:宋江又叫及时雨,呼保义
01, 引用的目标可以是变量和对象
引用必须初始化(将引用与目标绑定)
操作引用就是操作目标本身, 反之亦然
02, 一个变量可以有多个引用
就像一个人可以有多个外号
03, 一个引用只能对应一个目标
就像一个外号不能对应多个人, 比如: 及时雨指宋江, 及时雨不可能又指李逵
04, 引用的类型必须和目标一致
05, 有指针的引用, 没有数组的引用, 没有void引用
06, const 常引用, 可以确保变量的值不会被随意修改
07, 使用引用传递函数参数, 可以减少拷贝, 提高效率
08, 使用引用作为函数返回值,可以减少一次拷贝,提高效率
但要注意,返回值为引用类型时,不要把一个局部变量返回出去
因为函数结束, 局部变量就销毁了, 引用就会绑空,这个引用的值就不确定了
示例代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;
void Swap1(int &t_x, int &t_y)
{
int tmp = t_x;
t_x = t_y;
t_y = tmp;
}
//定义一个全局变量
double g_tmp = 0;
double& mul(double &t_x, double &t_y)
{
//double t_product = t_x * t_y;
g_tmp = t_x * t_y; // 解决方法, 用全局变量返回
//return t_product;
return g_tmp;
}
void fun1()
{
double t_a = 99.99;
}
void fun2()
{
double t_b = 88.8099;
}
struct Person
{
string name; //字符串类型
int t_age;
};
void getPersonInfo(const Person &person)
{
//person.name = "Rose";
cout << "name: " << person.name << endl;
cout << " age: " << person.t_age << endl;
}
//引用
int main()
{
//引用就是一个目标的别名, 就像水浒传里面每个人都有一个外号, 比如:宋江又叫及时雨,呼保义
//引用的目标可以是变量和对象
//引用必须初始化(将引用与目标绑定)
//操作引用就是操作目标本身, 反之亦然
int t_a = 100;
int &t_b = t_a;
cout << "t_a: " << t_a << " &t_a: " << &t_a << endl;
cout << "t_b: " << t_b << " &t_b: " << &t_b << endl;
cout << endl;
//一个变量可以有多个引用
int &t_c = t_a;
cout << "t_a: " << t_a << " &t_a: " << &t_a << endl;
cout << "t_c: " << t_c << " &t_c: " << &t_c << endl;
cout << endl;
//修改引用, 变量也会跟着变
//指向同一目标的引用也会随之改变
t_b = 200;
cout << "t_a: " << t_a << " &t_a: " << &t_a << endl;
cout << "t_b: " << t_b << " &t_b: " << &t_b << endl;
cout << "t_c: " << t_c << " &t_c: " << &t_c << endl;
cout << endl;
//一个引用只能对应一个目标
int t_d = 300;
//t_b = t_d; // 这里只是把 t_d 的值赋给 t_b, 而不是 t_b 是 t_d 的引用
//cout << "t_a: " << t_a << " &t_a: " << &t_a << endl;
//cout << "t_b: " << t_b << " &t_b: " << &t_b << endl;
//cout << "t_c: " << t_c << " &t_c: " << &t_c << endl;
//cout << "t_d: " << t_c << " &t_d: " << &t_d << endl;
//cout << endl;
//引用的类型必须和目标一致
//int t_e = 1000;
//double &t_f = t_e; //此时是编译不过的
//有指针的引用
int *t_g = &t_a;
int *&t_p = t_g;
cout << "&t_a: " << &t_a << " t_a: " << t_a << endl;
cout << " t_g: " << t_g << " *t_g: " << *t_p << endl;
cout << " t_p: " << t_p << " *t_p: " << *t_p << endl;
cout << endl;
//没有void引用
//void t_h = 500;
//void &t_i = t_h;//此时也是编译不过的
//没有数组的引用
//int arr[3] = {1, 2, 3};
//int &t_arr[3] = arr[3];//引用数组是非法的,编译不过
//const 常引用, 可以确保变量的值不会被随意修改
Person man = {"Jack", 20};
//如果getPersonInfo函数参数没加const, 那么man的成员的值可能被修改
//加了const, 如果man成员的值被修改,直接就编译不过
getPersonInfo(man);
cout << endl;
//使用引用传递函数参数, 可以减少拷贝, 提高效率
cout << "t_a: " << t_a << " &t_a: " << &t_a << endl;
cout << "t_d: " << t_d << " &t_d: " << &t_d << endl;
Swap1(t_a, t_d);
cout << "after swap : " << endl << "t_a: " << t_a << " &t_a: " << &t_a << endl;
cout << "t_d: " << t_d << " &t_d: " << &t_d << endl;
cout << endl;
//使用引用作为函数返回值,可以减少一次拷贝,提高效率
//但要注意,返回值为引用类型时,不要把一个局部变量返回出去
//因为函数结束, 局部变量就销毁了, 引用就会绑空,这个引用的值就不确定了
double t_m = 12.12;
double t_n = 13.13;
double &ret = mul(t_m, t_n);
cout << "ret: " << ret << endl;
cout << endl;
fun1();
cout << "ret: " << ret << endl;//此时ret的值将会改变
cout << endl;
fun2();
cout << "ret: " << ret << endl;
cout << endl;
cout << "hello, world" << endl;
system("pause");
return 0;
}