【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,并不是没有时间。

相关推荐
blammmp6 分钟前
Java:数据结构-枚举
java·开发语言·数据结构
何曾参静谧18 分钟前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
暗黑起源喵24 分钟前
设计模式-工厂设计模式
java·开发语言·设计模式
Chef_Chen28 分钟前
从0开始学习机器学习--Day13--神经网络如何处理复杂非线性函数
神经网络·学习·机器学习
WaaTong29 分钟前
Java反射
java·开发语言·反射
Troc_wangpeng30 分钟前
R language 关于二维平面直角坐标系的制作
开发语言·机器学习
努力的家伙是不讨厌的32 分钟前
解析json导出csv或者直接入库
开发语言·python·json
Envyᥫᩣ1 小时前
C#语言:从入门到精通
开发语言·c#
童先生1 小时前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
lulu_gh_yu1 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法