gpt4 book ai didi

c++ - 在所有情况下都喜欢 C++ 引用而不是指针真的是最佳实践吗?

转载 作者:IT老高 更新时间:2023-10-28 23:17:33 24 4
gpt4 key购买 nike

C++ FAQ说:

“尽可能使用引用,必要时使用指针。”

我觉得没有上面说的那么容易。对指针的引用通常更好的原因已经得到了很好的讨论。因此,我更愿意讨论一些特殊情况,即引用有意义但极不寻常且感觉不对:

对我来说,最明显的例子是它们在通用数据结构中的使用,例如树或链表。他们的接口(interface)当然可以使用引用来实现并且感觉更安全,但我还没有看到一个可以利用引用的实现,例如:

Node *parent = n.parent(); // parent might be unset -> pointer
Node &child = n.child(5); // child is always valid -> reference

虽然它看起来很吸引人,但它会导致这样的代码:

if(parent == &child) ... //  weird, unusual at least?

我想知道,这就是纯 C++ 的含义吗?

每次我尝试尽可能盲目地使用引用时,我都会遇到各种类似的不一致,最终以各种丑陋的方式混合指针和引用方式。

总结一下,为什么 operator new 首先不返回对新实例的引用而不是指针? (并在错误的情况下抛出):

Node &n = new Node;
delete &n;

这是一个荒谬的例子,但这不就是“纯 C++”吗?

最佳答案

一个引用一旦被初始化就不能被修改来引用一个不同的对象。但是可以修改指针以在运行时引用不同的对象。

一般经验法则

如果您希望变量在其生命周期内指向不同的对象,请使用指针。

如果您只想将一个变量用作另一个变量的别名,请使用引用。

作为参数

我们有时将参数作为引用传递(常量/非常量)。这将有助于避免在每次调用函数时复制整个对象。因此,当传递大尺寸的对象时,这将很有意义。

如果函数需要接收一些可以选择为空的参数,您可以使用指针。但是,同样,您始终可以为任何类定义一个静态空对象,并且可以使用它。

作为返回值

每当我们重载诸如 [] 或 << 之类的运算符时,我们都会返回引用。这是因为,如果我说 vec[0] = 10,它实际上应该将值 10 分配给 vec 中的位置 0。由于明显的原因,在这里我不能使用指针。 *vec[0] = 10 不仅看起来不错。另外,你应该保证,当你返回一个引用时,它总是引用一个对象(它永远不应该为空)。

同样,当函数可以返回 NULL 值时,请使用指针,否则您可能必须为该类声明一个静态 null 对象。

作为数据成员

应该在构造函数中初始化引用。因此,一旦构造了对象,它们就无法更改。

因此,如果您需要一个在类的生命周期内需要指向不同对象的变量,那么指针将是一个不错的选择。

关于c++ - 在所有情况下都喜欢 C++ 引用而不是指针真的是最佳实践吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9745059/

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