【C++课程学习】:C++入门(引用)

🎁个人主页:我们的五年

🔍系列专栏:C++课程学习

🎉欢迎大家点赞👍评论📝收藏⭐文章

目录

🍩1.引用的概念:

🍩2.引用和指针是两个概念:

🍩3.权限问题:

🍩4.引用的使用场景:

🌽1.做参数:

🌽2.做返回值:

🍩5.传值和传引用的区别:


🍩1.引用的概念:

引用是已经存在的取了一个别名,没有去新开辟新的空间,没有定义一个新的变量。它和引用的变量共用一块空间。

引用的结构:

类型& 引用变量名(对象名)=引用实体。

🍩2.引用和指针是两个概念:

引用是一个变量的别名,指针存储的是一个变量的地址。

1.引用不需要开辟新的空间(但是底层逻辑是需要的);指针要开辟新的空间存放地址(32位下是4个字节,64位下是8个字节)。

2.引用必须初始化;但是指针可以不初始化。

3.引用不能指向NULL;但是指针可以指向NULL。


4.引用+1,就是引用实体+1;指针+1是往后偏移一个类型的大小。

#include<iostream>
using namespace std;

int main()
{
	int a = 10;
	int& b = a;
	int* c = &a;
	//引用和指针+1的区别
	cout << "b="<<b << endl;
	cout << "b+1="<<b + 1 << endl;
	cout << "c="<<c << endl;
	cout << "c="<<c + 1 << endl;
}

5.sizeof的不同,sizeof引用是类型的大小;sizeof指针就是是指针的大小,32位平台是4个字节,64位平台是8个字节,所以一直用这么大的空间去存储变量的地址。

#include<iostream>
using namespace std;

int main()
{
	//引用和指针sizeof的区别
	cout << "sizeof(char&)=" << sizeof(char&) << endl;
	cout << "sizeof(int&)=" << sizeof(int&) << endl;
	cout << "64位平台:sizeof(int*)=" << sizeof(int*) << endl;
}

6.有多级指针,但是没有多级引用(现在目前知识水平是觉得没有必要)。

7.引用实体以后就不能再去引用其他实体。

8.引用比指针更安全。因为指针访问实体需要进行解引用操作,但是引用访问实体是编译器自己操作。

9.访问实体的方式不同。指针需要显示解引用,但是引用是编译器自己处理。

🍩3.权限问题:

权限只能平移或者缩小,不能放大。

const只有可读权限,没有const就是可读可写的权限。允许const到const(权限平移),允许int到const int(权限缩小)。

但是不能从const int到int(权限放大)。

#include<iostream>
using namespace std;

int main()
{
	const int a = 10;

	//权限平移
	const int& b = a;

	//权限放大,错误
	//int& c = a;

	//权限缩小
	int x = 10;
	const int& y = x;
}

🍩4.引用的使用场景:

🌽1.做参数:

做函数的参数,因为是实体的别名,所以直接可以改变实体。

作返回值的时候,一定要注意出了函数以后,变量还在。

#include<iostream>
using namespace std;

//做参数
void Add(int& a, int& b){
	a++;
	b++;
}

int main()
{
	int a = 1, b = 2;
	Add(a, b);
	cout << "a=" << a << endl;
	cout<< " b=" << b << endl;
	return 0;
}

🌽2.做返回值:

#include<iostream>
using namespace std;

//做参数
int& func() {
	static int a = 10;
	cout << &a << endl;
	return a;
}

int main()
{
	int& a = func();
	cout << &a << endl;
	return 0;
}

🍩5.传值和传引用的区别:

以值作为参数或者返回类型,不会传变量本身,而是传实参的一份临时拷贝。所以传值的效率是十分低下尤其是传参的个数多,次数多的时候。

#include<iostream>
#include<time.h>
using namespace std;

void func1(int a) {

}
void func2(int& a) {

}
int main()
{
	int a = 10;
	size_t begin1 = clock();
	for (int i = 0; i < 100000; i++)
		func1(a);
	size_t end1 = clock();
	size_t begin2 = clock();
	for (int i = 0; i < 100000; i++)
		func2(a);
	size_t end2 = clock();
	cout << end1 - begin1 << endl << end2 - begin2 << endl;
}

0表示小于1ms,并不是没有时间。

相关推荐
MSTcheng.几秒前
【C语言】指针(5)
c语言·开发语言
╮壞孩子的天1 分钟前
C语言多人聊天室 ---chat(客户端聊天)
c语言·开发语言
IT猿手12 分钟前
2025高维多目标优化:基于导航变量的多目标粒子群优化算法(NMOPSO)的无人机三维路径规划,MATLAB代码
开发语言·人工智能·算法·机器学习·matlab·无人机·cocos2d
呱牛do it16 分钟前
Python Matplotlib图形美化指南
开发语言·python·matplotlib
pianmian119 分钟前
python制图之小提琴图
开发语言·python·信息可视化
水瓶丫头站住20 分钟前
Qt中QRadioButton的使用
开发语言·qt
非 白26 分钟前
【Java】代理模式
java·开发语言·代理模式
im长街27 分钟前
Ubuntu22.04 - brpc的安装和使用
学习
知识分享小能手32 分钟前
Html5学习教程,从入门到精通,HTML5 简介语法知识点及案例代码(1)
开发语言·前端·javascript·学习·前端框架·html·html5
muxue17835 分钟前
go:运行第一个go语言程序
开发语言·后端·golang