🎁个人主页:我们的五年
🔍系列专栏:C++课程学习
🎉欢迎大家点赞👍评论📝收藏⭐文章
目录
🍩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,并不是没有时间。