繁体   English   中英

C++:为什么我们不能有对引用或引用数组的引用?

[英]C++: why can't we have references to references or array of references?

我注意到没有对引用的引用但是有指向指针的指针,也没有引用数组而是指针数组。

谁能给我任何理由?

指针是可变的(如果是非常量的),引用永远不会。 因此,没有必要指向引用的指针或引用。

此外,引用必须始终引用某些东西 - 没有空引用这样的东西。 这就是为什么没有引用数组的原因,因为没有办法将数组内的引用实例化为有意义的值。

它符合C ++标准8.3.2 / 4:

不应引用引用,不引用引用数组,也不引用引用指针。

引用是语言级别的抽象。 这是将变量别名化为另一个变量的不透明方式。 虽然在幕后,编译器可能会使用指针来计算引用,但它们在更高级别上是非常不同的东西。 另一方面,程序员明确地使用指针来实现间接。 指针变量是与其指向的不同的变量。 引用应该被认为好像它只是原始变量的别名,而不是它是另一个持有地址的变量。 因此,变量别名的别名只是变量本身的别名。 考虑到绑定,对变量的引用是编译时的事情可能有助于理解这种行为背后的基本原理。

有了这个推理,你可以争辩说,因为数组是存储值而不是变量的结构,所以它们能够存储变量的别名是没有意义的。 基本上,一个引用变量(我的意思是指针,如果存在, 可以由编译器用来连接引用)对程序员来说是C ++级别不可见的。 如果可以声明引用数组,则编译器可能需要传递给数组的常量索引才能在编译时解析绑定。

C ++标准8.3.2 / 4:

There shall be no references to references, no arrays of references, and no pointers to references.

这背后的原因是在运行时不存在引用本身。 引用仅仅是位置的另一个名称。 他们是不变的。

我认为我们可能需要首先重申 arrays 的引用一直在 Java 和 Python 中使用。事实上,Java 程序员从未真正尝试直接使用addresses of data (指针)。 考虑以下使用引用数组的完全合法的 Java 示例:

String[] array_of_references = new String[2]; // create array of String object references
array_of_references[0] = "Hello"; // "Hello" is a string object reference
array_of_references[1] = "World!";
print(array_of_references[0].toLowerCase()); // use dot to access method of ref.
// prints hello

我在这里有点撒谎,因为 C++ 中的引用与 Java 中的引用不完全相同

无法在 C++ 中创建引用数组的区别是 C++ 中的every reference in C++ has to *always*(in all scopes) be assiciated with some variable *name* in the program 换句话说,要在 C++ 中创建引用数组,您需要手动命名数组的每个元素,这与 arrays 的用处背道而驰。这是我(勇敢但可怜)尝试实现 C++ 数组的-固定尺寸 3 的参考资料:

class ArrayOfReferences_size3{
  public:
    // constructor
    ArrayOfReferences_size3(int &el_1, int &el_2, int &el_3):
    first_el(el_1), second_el(el_2), third_el(el_3) {}

    int& first_el; // gotta name it again
    int& second_el; // gotta name it again
    int& third_el; // gotta name it again
};

int main() {
  int el_1 = 1; // gotta name the value
  int el_2 = 2; // gotta name the value
  int el_3 = 3; // gotta name the value
  ArrayOfReferences_size3 my_array(el_1, el_2, el_3);
  cout << my_array.first_el 
       << my_array.second_el 
       << my_array.third_el << "\n";
}

Java 可以允许引用未命名,因为 java 引用可以像 c++ 指针一样表示它们自己的值——它们不需要绑定到名称。 事实上,Java 引用可以有一个null值,就像指针可以有nullptr值一样。
在下面的示例中,请注意字符串 object 引用“Hello”是如何未命名的,并且访问它的唯一方法是通过索引到数组中:

array_of_reference[0] = "Hello"; // Impossible with C++ references

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM