[C++: 引用】(一)

简介: [C++: 引用】(一)

To shine,not be illuminated.

1fdf66bbb6ce46cb8944cfb60be54706.jpg

1 引用概念

引用 不是新定义一个变量,而 是给已存在变量取了一个别名 ,编译器不会为引用变量开辟内存空间,它和它引用的变量 共用同一块内存空间。

比如:你的正式姓名和你的小名或者别名。

使用方法:

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

我们可以来举个例子:

int main()
{
  int a = 10;
  int& sa = a;
  int b = 20;
  int& sb = b;
  return 0;
}

a5bbcd36cf494a3d9e70209a96a804c8.png

通过调试我们也能够发现a和sa其实共用的是同一块空间,这也就解释了为啥引用只是给变量取了一个新名字,并没有为引用变量开辟新的空间。

注意:正确用法:引用类型必须和引用实体同种类型

2 引用特性

  • 1. 引用在定义时必须初始化
  • 2. 一个变量可以有多个引用
  • 3. 引用一旦引用一个实体,再不能引用其他实体

我们一个一个来看:

假如引用变量不初始化

int main()
{
  int a = 10;
  int& sa ;
  return 0;
}

这种方式显然是会直接报错的:

0cf868b1ec314d399c1831301abd4d66.png

一个引用变量可以有多个引用:

int main()
{
  int a = 10;
  int& b = a;
  int& c = a;
  return 0;
}

这里b和c都是a的别名,修改其中任何一个这3个的值都会发生改变。

假如拿一个已经引用过的实体再去引用其他实体:

47b45db9105343cd9c17b46b7dc46aac.png

这样写直接就报错了,有人会想到换一种方式写呢:

int main()
{
  int a = 10;
  int& b = a;
  int e = 20;
  b = e;
  return 0;
}

这里b还是e的引用吗?

显然不是的,这里只是将e的值赋给了b,b还是a的引用,程序结束后a和b都应该为20,我们可以打开监视窗口看看:

18eb9fb3f71442e4bbe9e8a5bebfdfb9.png

3 常引用

我们来看下面这个栗子:

int main()
{
  const int a = 10;
  int& b = a;
  return 0;
}

上述代码能够被编译通过吗?

f1f8009fca314a24b36ead7e1dbd3769.png

很明显这种写法是错误的,C++认为这种写法是不安全的,const int是只读权限,而int&却是既有读权限也有写权限,像这种权限放大C++是不支持的,权限缩小或者权限相等C++是支持的。

比如下面这两种写法都是合法的:

int main()
{
  //权限相等
  const int a = 10;
  const int& b = a;
  //权限缩小
  int c = 20;
  const int& d = c;
  return 0;
}

再来看下面一段代码:

int main() 
{
  double d = 12.12;
  int& i = d;
  return 0;
}

上面代码能够编译通过吗?

cceff86316f5413b86bcb1f15c1750f1.png

我们可能会想:引用类型和引用实体必须是同一种类型的,所以说就错误了呗。

引用类型和引用实体一定要是同一种类型的吗?

我们将程序再修改一下:

1dcba0698cd14d63acb593365a7a8d8a.png

我们发现程序居然能够跑过,只是错误变成了一个警告,为什么呢?

通过C语言的知识我们知道:double类型的d如果要转换成int类型的i是会发生截断的,首先会用一个临时变量来保存被截断后的值,再将该值换一个新的名称,d本身是不会发生任何改变的。而这个临时变量是具有常数性的(这个很重要,后面也会反复的提及)不能被修改,也就是不能够写,只能够读。由于权限不能够升高,所以我们必须得加const才行。

我们再来回答上面的问题,引用类型和引用实体一定要是同一种类型的吗?

如果想要正确的使用,这句话显然没有什么毛病,但是并不是说引用类型和引用实体不是同一种类型程序一定就会报错。

建议:以后我们引用一个实体是如果不想改变这个实体,最好加上const.

目录
相关文章
|
20天前
|
存储 Java C++
C++ 引用和指针:内存地址、创建方法及应用解析
C++中的引用是现有变量的别名,创建时需用`&`运算符,如`string &meal = food;`。指针存储变量的内存地址,使用`*`创建,如`string* ptr = &food;`。引用必须初始化且不可为空,而指针可初始化为空。引用在函数参数传递和提高效率时有用,指针适用于动态内存分配和复杂数据结构操作。选择使用取决于具体需求。
38 9
|
21天前
|
存储 安全 编译器
【C++专栏】C++入门 | 函数重载、引用、内联函数
【C++专栏】C++入门 | 函数重载、引用、内联函数
27 0
|
28天前
|
存储 分布式计算 安全
我的C++奇迹之旅:值和引用的本质效率与性能比较2
我的C++奇迹之旅:值和引用的本质效率与性能比较
|
28天前
|
编译器 C++
我的C++奇迹之旅:值和引用的本质效率与性能比较1
我的C++奇迹之旅:值和引用的本质效率与性能比较
|
2月前
|
安全 编译器 Linux
【C++练级之路】【Lv.1】C++,启动!(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for,nullptr)
【C++练级之路】【Lv.1】C++,启动!(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for,nullptr)
|
2月前
|
存储 安全 C++
在C++指针和引用
在C++指针和引用
|
2月前
|
存储 JSON 安全
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
67 0
|
2天前
|
存储 安全 编译器
【C++入门】缺省参数、函数重载与引用(下)
【C++入门】缺省参数、函数重载与引用
|
2月前
|
设计模式 算法 数据安全/隐私保护
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
26 0
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
|
2月前
|
存储 算法 编译器
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(一)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
45 0