C++学习之引用

引用

  • 概念:引用就是变量/对象的 门牌号,别名
  • 引用意义:在一些场景下可以 替代指针
  • 比如
#include <iostream>
using namespace std;
void main()
{
	int a = 10;
	int &b = a;	//a的别名
	 a = 11;
	 {
	  int *p = &a;
	  *p = 12;
	  printf("a %d\n", a);  //12
	 }
	 b = 14;
	 printf("a %d b %d \n", a, b); //14 14
	 system("pause");
}
输出:
/*
	 a 12
	 a 14 b 14
	 请按任意键继续. . .
 */
  • 引用必须初始化
{
	int a =10;
	int &b = 20;//普通引用 必须初始化
	b =11;
	cout<<a<<“ ”<<b<<endl;	
	system("pause");
}
输出:
	11 11
	请按任意键继续. . .
  • 引用作为函数参数声明时不进行初始化

//实现两个数字之间的交换
void swap(int &a,int &b) //交换
{
	 int c = 0;
	 c = a;
	 a = b;
	 b = c;
}
void main()
{
	 int x, y;
	 x = 10; y = 20;
	 swap(x, y);
	 printf("x %d y %d \n", x, y); //11 11
	 system("pause");
}
  • 引用做函数参数

 struct Teacher
 {
 	char name[54];
 	int age;
 }
 
 void printfT(Teacher *pT)
{
	 cout << pT->age << endl;
 }
 
//pT是t1的别名 ,相当于修改了t1
void printfT2(Teacher &pT)
{
	 //cout<<pT.age<<endl;
	 pT.age = 33;
}

//pT和t1的是两个不同的变量
void printfT3(Teacher pT)
{
	cout<<pT.age<<endl;
	pT.age = 45;	//只是修改了pT变量,不会修改t1
}
void main()
{	
	 Teacher t1;
	 t1.age = 35;
	 printfT(&t1);
	 printfT2(t1); //pT是t1的别名
	 printf("t1.age:%d \n", t1.age); //33
	 printfT3(t1);// pT是形参 ,t1 copy一份数据 给pT     //---> pT = t1
	 printf("t1.age:%d \n", t1.age); //35
	 cout << "hello..." << endl;
	 system("pause");
}
  • 引用本质

  • 本质:常指针
  • 占用空间:和指针大小相同
struct Teacher
{
	 int &a;
	 int &b;
};
void main04()
{
	 int a = 10;
	 int &b = a;
	 a = 11;
	 cout << "a " << a << endl;
	 cout << "b " << b<< endl;
	 cout << "&a " << &a << endl;  //
	 cout << "&b " << &b << endl;  //地址相同
	 cout << "sizeof yinyong is  " << sizeof(Teacher) << endl; //8
	 system("pause");
}
  • 引用当左值

int getA1()
{
	 int a = 10;
	 return a;
}
int &getA2()
{
	 int a = 10;
	 return a;
}
int *getA3()
{
	 int a = 10;
	 return &a;
}

void main05()
{
	 int a1 = getA1();
	 int a21 = getA2();
	 int &a22 = getA2();  //若返回 栈变量, 不能成为其引用的初始值
	 int *a3 = getA3();
	 cout << "a1: " << a1<<endl; //10
	 cout << "a21: " << a21 << endl; //10
	 cout << "a22: " << a22 << endl; //addr
	 cout << "a3: " << a3 << endl; //addr
	system("pause");
 }
  • //返回变量为static 或者 全局变量 ,当引用

int j1()
{
	 static int a = 10;
	 a++;
	 return a;
}
int &j2()
{
	 static int a = 10;
	 a++;
 	return a;
}
void main06()
{
	 int a1 = 10;
	 a1 = j1();
	 int a21 = 20;
	 a21 = j2();
	 int &a22 = j2();  
	 cout << "a1: " << a1 << endl; //11
	 cout << "a21: " << a21 << endl; //11
	 cout << "a22: " << a22 << endl; //12
	 system("pause");
}
  • 指针引用

    • 常引用初始化方法
    • 1 用 变量 初始化 常引用
    • 2 用字面量 初始化 常引用
//、、、、、、、、常引用 知识架构、、、、、、、、、、、、、、、、、、、、
void main07()
{
	 //普通引用
	 int a = 10;
	 int &b = a;
	 //常引用
	 int x = 20;
	 const int &y = x; //变量拥有 只读属性  x不可修改
	 //y = 21;
	 //常引用 初始化 2情况///
	 //1 用变量 初始化 常引用
	 {
	  int x1 = 30;
	  const int &y1 = x1;
	 }
	 //2 用字面量 初始化 常引用
	 {
	  const int a = 10;
	  //int &m = 41;  字面量没有内存地址
	  const int &m = 42; //C++编译器会分配内存空间 给&m
	 }
	 system("pause");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值