gpt4 book ai didi

c++ - 为什么指针不能转换为引用?

转载 作者:太空宇宙 更新时间:2023-11-04 14:37:03 24 4
gpt4 key购买 nike

我在多个来源中读到,C++ 引用只不过是一个具有编译时限制的指针。

如果这是真的,为什么我不得不取消对指针的引用以便将其传递给需要参数的函数?

void FooRef(const int&);
void FooPointer(const int*);

int main()
{
int* p = new int(5);
FooPointer(p);
FooRef(*p); // why do I have to dereference the pointer?

...
}

据我所知,如果我要将 int 传递给 FooRef,编译器会根据变量的地址为我创建指针(引用),但是如果该类型已经是一个指针,那么取消引用它似乎毫无意义。在我看来,我正在取消引用一个指针,只是为了让编译器从取消引用的值创建另一个指针,这对我来说似乎毫无意义。
仅复制指针而不是仅引用+取消引用该值会不会更简单/性能更高? (也许这真的是正在发生的事情?)

我是不是漏掉了什么?在这种情况下调用 FooRef 是否比调用 FooPointer 慢?
引用和指针在编译期间真的会产生相同的代码吗?

最佳答案

引用可以根据底层指针实现这一事实是无关紧要的。许多编程概念可以根据其他事物来实现。您可能还会问为什么我们有 while 循环,而 while 可以根据 gotojmp 来实现。不同语言概念的意义在于使程序员更容易,而引用是为方便程序员而设计的语言概念。

您可能误解了引用的目的。引用为您提供指针的积极方面(传递便宜),但由于它们与常规值具有相同的语义,因此它们消除了使用指针带来的许多危险:(指针算术、悬挂指针等)更多重要的是,引用是与 C++ 类型系统中的指针完全不同的类型,允许两者互换是疯狂的(这会破坏引用的目的。)

引用语法有意旨在反射(reflect)常规值语义的语法 - 同时为您提供廉价传递内存地址而不是复制整个值的能力。

现在,转向你的例子:

FooRef(*p); // why do I have to dereference the pointer?

您必须在此处取消引用指针,因为 FooRef 需要一个 referenceint,而不是对 int* 的引用。请注意,您还可以有一个对指针的引用:

void FooPointerRef(const int*&);

采用指针引用的函数使您能够从函数内部修改指针的内存地址。在您的示例中,您必须显式取消引用指向镜像值语义的指针。否则,查看函数调用 FooRef(p) 的人会认为 FooRef 采用值指针或引用指针 - 但不是一个(非指针)值或一个引用。

关于c++ - 为什么指针不能转换为引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16390628/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com