C++:当你有指针时,为什么还需要引用?
在C++中,为什么在拥有指针的情况下还需要引用呢?这个问题的出现是因为运算符重载。使用指针进行“通过引用传递”会导致不可接受的语法。这也是C++最初引入引用的原因之一。或许,如果没有引用,编译器本身会传递一个指向常量的指针而不是引用。不考虑类型安全性,我认为引用只是“语法糖”。但是,如果使用指针进行重载,你将无法通过值传递或返回值。引用是通过引用进行传递的。它们使语法更清晰,但生成的代码与普通指针的代码并没有太大区别。正如Stroustrup在链接中指出的那样,使用指针进行运算符重载是丑陋的。虽然不是不可能,但是实际上是不可能的,因为你不能取一个右值的地址。如果使用指针进行重载,&x + &y
是可能的,但是你如何编写x + y + z
呢?当然,如果没有引用,编译器必须对此提供一些支持。就像对引用一样。尽管我们可以从更积极的回答者那里推断出这是主要原因,但是没有引用,这只是一条评论,肯定不是一个答案。但是嘿,口味不可争议!那么为什么编译器不让你直接编写:Foo operator +(const Foo* x, const Foo* y)
并通过“Foo a, b; a + b”来使用它(即隐式地添加“&”)呢?你可以放弃语言中的许多规则和语法,仍然能够拥有同样的功能。而且整个语言中的隐式性会少得多。
C++中为什么在拥有指针的情况下还需要引用?这个问题的出现的原因是:
1. 仅使用指针无法正确地进行按引用传递或按引用返回。
2. 有些方法需要引用。如果没有引用,如何实现复制构造函数?
3. 有时需要强制别名。使用指针无法实现这一点,因为指针可以被更改。而引用在初始化时将绑定到同一个对象,通过其作用域保证其引用的对象不会改变。
4. 安全性问题。
5. (const)引用可以绑定到临时对象。要创建一个临时指针,你需要在传递给它的方法中释放它。但是你无法在内部判断它是临时的还是非临时的。
解决这个问题的方法是使用引用。
引用的优点是可以更容易地进行按引用传递和返回。引用还可以强制别名,并且不允许在初始化后更改指向的对象。与指针不同,引用可以绑定到临时对象。此外,使用引用还可以提高代码的可读性和可维护性。
引用可以看作是指针的一种语法糖。引用在某些情况下可以提供更简洁的代码,并且更安全,因为引用不允许指向不同的对象。如果没有引用,编译器可能会自动将指针传递给const,但不考虑类型安全性。
尽管在C++中已经有指针,但引用的存在是为了解决指针无法完全满足的需求,特别是在按引用传递和返回值时。引用提供了更方便、更安全的方式来处理这些情况。