Reference

Reference

三种变量

  • 值 -> value

  • 指针 -> pointer

  • 引用 -> reference


&取址符

示例代码:

#include <iostream>

using namespace std;

int main() {
int x = 0;
int* p = &x; // int类型的指针变量.值是x的地址.那么在内存层面.这个p就指向了x -> 四个字节
int& r = x; // r代表x,x=0那么r=0,r是一个整数.内存层面也有一根指针指向x -> 编译器实现是使用指针去实现
/*
* 引用与指针的区别 -> 引用声明了以后就不会再变化了.但是指针可以
* reference的特点 -> 声明引用变量一定要有初值
*/

int x2 = 5;
r = x2;
/*
* 在这个声明当中.又声明了一个int类型的变量
* 将x2赋值给r,那么因为上面已经将x赋值给r了.r就是x,所以x也会变成5
* reference就只是一种代表,他的大小由代表的东西决定.而pointer从声明出来了以后大小就确定了
*/

int& r2 = r; // 因为r代表了x.现在r赋值给r2,那么r2也代表x
}

注意:

在编译器层面会有这样的表示方式:

sizeof(r) == sizeof(x);
// 因为r代表x.所以x如果是100个字节那么r也是一百个字节
&x == &r; // 因为r代表了x所以r在那里x在那里 -> 地址相同

java当中所有的变量都是reference

reference通常不用于声明变量.主要用于形参和返回值的描述

reference的声明更多的是从被调用端来看的

示例代码:

#pragma
#ifndef __REFERENCE__
#define __REFERENCE__

typedef struct Ref { int a; } R;

void func_one(Ref* pobj) { pobj->a; }
void func_two(Ref obj) { obj.a; }
void func_three(Ref& obj) { obj.a; }

#endif // !__REFERENCE__

调用端代码:

#include <iostream>
#include "reference.hpp"

using namespace std;

int main() {
Ref obj;
func_one(&obj); // 接口不同
func_two(obj);
func_three(obj); // 速度比较快.底部是指针
}

总结:

针对func_twofunc_three只有一个地方不同.调用方式和传递参数是一致的.并且func_three速度还会更快

same signature

示例代码:

void imag(Ref obj) { obj.a; }
void imag(Ref& obj) { obj.a; }

这里涉及到了函数重载.因为是同名函数.函数签名部分是函数名称到第一个{之前的部分,会出现歧义.所以这两个函数不能共存

第一个)到第一个{之间可以加const声明,强调返回值不会改变 -> const是签名的一部分.如果两个函数完全一样.一个有const一个没有const是可以并存的

posted @ 2024-04-15 18:04  俊king  阅读(3)  评论(0编辑  收藏  举报