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

相关推荐
敲上瘾2 分钟前
动静态库的制作与使用(Linux操作系统)
linux·运维·服务器·c++·系统架构·库文件·动静态库
Uitwaaien544 分钟前
51单片机——按键控制LED流水灯
c++·单片机·嵌入式硬件·51单片机
漫漫进阶路4 小时前
VS C++ 配置OPENCV环境
开发语言·c++·opencv
架构文摘JGWZ6 小时前
FastJson很快,有什么用?
后端·学习
BinaryBardC6 小时前
Swift语言的网络编程
开发语言·后端·golang
code_shenbing6 小时前
基于 WPF 平台使用纯 C# 制作流体动画
开发语言·c#·wpf
邓熙榆6 小时前
Haskell语言的正则表达式
开发语言·后端·golang
ac-er88887 小时前
Yii框架中的队列:如何实现异步操作
android·开发语言·php
马船长7 小时前
青少年CTF练习平台 PHP的后门
开发语言·php
hefaxiang7 小时前
【C++】函数重载
开发语言·c++·算法