引用类型的定义是什么?

问题描述 投票:3回答:4

您如何以正式和严格的方式定义(解释)C ++中的引用类型是什么?

我尝试去Google搜寻,并研究了Stroustrup的“ C ++编程语言”,但是在那里我看不到这个概念的定义。

c++ reference
4个回答
2
投票

引用是别名,是对象的备用名称。它本身不是对象(因此,not是指针,即使它们的某些用法与指针的用法重叠)。

参考文献因其非客观性而受到一定的限制。例如,您不能创建引用数组。它们必须在声明后立即进行初始化(绑定,就座),因为没有别名的对象就不可能存在它们。

但是,您可以存储它们,并且它们遵循自动变量或成员变量的规则。它们的用途之一是通过C ++的按值传递函数调用。

请注意,const引用具有别名的整洁效果:绑定到临时(即未命名)对象时,它们为该对象命名,因此将其寿命延长到引用本身的寿命。

{ // Block scope
     Foo fooVal = makeFoo(); // Say makeFoo() returns a (temporary, unnamed) Foo
     // Here the temporary Foo is dead (fooVal is a copy).

     // Foo &fooRef = makeFoo(); // Error, reference is non-const
     Foo const &fooCRef = makeFoo(); // All good

     // ...

     // The second temporary is still alive
     fooCRef.doSomethingFunny(); // Works like a charm !

} // The second temporary dies with fooRef

不过请注意,有可能(尽管人为地)使对象超出范围,而引用仍指向该对象。然后,您将具有悬挂引用,该不再使用(这样做将是未定义的行为)。

Foo *fooPtr = new Foo; // Here is a Foo
Foo &fooRef = *fooPtr; // Here is an alias for that Foo

delete fooPtr; // Here is the end of that Foo's life

fooRef.doSomethingFunny(); // Here comes trouble...

1
投票

关于

您如何以正式和严格的方式定义(解释)C ++中的引用类型是什么?

C ++ 11标准在其中为引用类型

提供了以下正式和严格的定义。

§8.3.2/ 1

在声明T D中,D具有以下任一形式&属性说明符序列optD1&& 属性说明符序列optD1并且声明T D1中的标识符类型为“ derived-declarator-type-list T”,则声明的类型D的标识符为“ T的引用[derived-declarator-type-list的引用。”


但是,如果您对C ++引用实际上是什么更感兴趣(除了该术语的通俗用法,请在表达式中检查其含义的定义,

§5.5

”如果表达式最初的类型为“对T的引用”(8.3.2,8.5.3),则该类型在调整为T之前任何进一步的分析。该表达式指定由引用表示的对象或功能,并且表达式是左值还是x值,具体取决于表达式

有效地,这意味着引用充当

alias

您可以将引用视为自动取消引用的const指针,它解释了大多数行为,只是引用不一定占用存储空间(编译器可能会完全优化它)。

0
投票
C和C ++(对象和类除外!)之间的主要区别是引用。引用就像指向变量的const指针。分配引用有点像使用指针,但使用&而不是*,并且您不需要区别。区别在于您将地址分配给指针,但将变量分配给参考变量。下面的行建议将a的值复制到aref中。但是不是,而是aref是对变量a的引用。分配后,aref与a相同。对aref的任何更改都是对a的更改,如下所示:

int&aref = a;

#include <stdio.h> #include "stdafx.h" int main() { int a=9; int & aref = a; a++; cout << "The value of a is %i\n" << aref; return 0; }

也要记住

  1. 引用必须始终引用某物。不允许为NULL。
  2. 创建引用时必须对其进行初始化。未分配的引用不能存在。
  3. 一旦初始化,就无法将其更改为另一个变量。

如果有帮助,请告诉我,谢谢


0
投票
根据一些专家的观点,引用类型本身不是C ++引用,而是与值类型相反。

https://abseil.io/blog/20180531-regular-types给出string_view和span作为引用类型的示例,这些引用类型在传递给函数时应像引用参数一样起作用。

https://docs.microsoft.com/en-us/cpp/cpp/value-types-modern-cpp?view=vs-2019 Microsoft文档将引用类型与多态类型(具有至少一个虚函数或成员变量的类型)同义。它们与值类型相反(Bjarne Stroustrup称为具体类型)。使用值类型时,由于运行时多态性,编译器可以直接访问需要间接访问的成员和引用类型。

© www.soinside.com 2019 - 2024. All rights reserved.