引用相对于指针的最大好处之一是更简单和可读性更高。与往常一样,当您简化某些内容时,您会使其更易于使用,但会以灵活性和控制权为代价(正如其他人提到的那样)。
指针经常被批评为“丑陋”。
class* myClass = new class();
现在每次使用它时都必须先取消引用它
myClass->Method() or (*myClass).Method()
尽管失去了一些可读性并增加了复杂性,但人们仍然需要经常使用指针作为参数,这样您就可以修改实际对象(而不是通过值传递)并获得不必复制巨大对象的性能。
对我来说,这就是为什么引用首先“诞生”以提供与指针相同的好处,但没有所有指针语法。现在您可以传递实际的对象(而不仅仅是它的值),并且您可以通过一种更易读、更正常的方式与对象进行交互。
MyMethod(&type parameter)
{
parameter.DoThis()
parameter.DoThat()
}
C++ 引用与 C# / Java 引用的不同之处在于,一旦您为它分配了一个值,就不能重新分配它(并且必须在声明它时分配它)。这与使用 const 指针(不能重新指向另一个对象的指针)相同。
Java 和 C# 是非常高级的现代语言,它们清理了多年来在 C / C++ 中积累的大量混乱,而指针绝对是需要“清理”的东西之一。
就您关于知道指针的评论使您成为更强大的程序员而言,这在大多数情况下都是正确的。如果您知道某些东西的“工作原理”,而不是在不知道的情况下使用它,我会说这通常会给您带来优势。有多少优势总是会有所不同。毕竟,在不知道如何实现的情况下使用某些东西是 OOP 和接口的众多优点之一。
在这个具体的例子中,知道指针对你的引用有什么帮助?理解 C# 引用不是对象本身而是指向对象是一个非常重要的概念。
#1:你没有传递价值
对于初学者来说,当您使用指针时,您知道指针仅包含一个地址,仅此而已。变量本身几乎是空的,这就是为什么它作为参数传递非常好。除了性能提升之外,您正在使用实际对象,因此您所做的任何更改都不是临时的
#2:多态性/接口
当您有一个接口类型的引用并且它指向一个对象时,您只能调用该接口的方法,即使该对象可能具有更多功能。对象也可能以不同的方式实现相同的方法。
如果你很好地理解了这些概念,那么我认为你不会因为没有使用指针而错过太多。 C++ 经常被用作学习编程的语言,因为有时候弄脏你的手是件好事。此外,使用较低级别的方面可以让您欣赏现代语言的舒适性。我从 C++ 开始,现在是 C# 程序员,我确实觉得使用原始指针帮助我更好地理解了底层发生的事情。
我认为每个人都没有必要从指针开始,但重要的是他们了解为什么使用引用而不是值类型,而理解这一点的最佳方法是查看它的祖先,即指针。