什么是C ++中Reference和Pointer返回类型之间的区别

问题描述 投票:15回答:4

如果我要在C ++中创建一个简单的对象,返回成员的地址与返回指针之间的区别是什么。据我所知,C ++没有自动垃圾收集,因此它不会保留引用计数。那么为什么会有人这样做呢:

class CRectangle {
public:
    string& getName( );
    int&    getWidth( );
    int&    getHeight( );
private:
    string  name;
    int     height;
    int     width;
};

而不是这样:

class CRectangle {
public:
    string* getName( );
    int*    getWidth( );
    int*    getHeight( );
private:
    string  name;
    int     height;
    int     width;
};

我意识到这些将允许您访问成员数据,但我并不关心这个简单示例中的正确封装。那么差异是什么?加速?可读性?样式?

c++ pointers reference coding-style address-operator
4个回答
22
投票

&(在此上下文中)并不意味着“地址”。

声明为string& getName( );的函数返回引用,而不是指针。引用本质上是另一个对象的别名。因此,在这种情况下,它不会返回对象名称的副本或指向名称的指针,而是返回对名称本身的引用。因此,对返回对象的任何更改都将直接应用于对象的名称。

您可以通过返回指针来实现相同的目标,但是存在两个显着差异:

  • 指针需要特殊的语法才能访问(*->运算符),而引用的使用方式与使用对象本身完全相同。
  • 一个指针可以是null,参考不能。因此,无论何时使用指针,您都会向读者发出“此值可能是null”的信号。

9
投票

在这种情况下,&意味着参考 - 而不是地址。

  • 指针可以是0 - 在格式良好的程序中,引用不能。
  • 返回指针时,所有权可能会更加明确。
  • 可读性是主观的 - 我会说尽可能使用参考。
  • 为了提高效率,没有真正的区别。

0
投票

首先,&form在C ++中称为“引用”。 *表单称为“指针”或“地址”。

加速 - 没有区别。可读性 - 对于引用可能略有优势,在upstack代码中没有derefencing。

风格 - 明确破坏封装是足够糟糕的风格来掩盖任何其他东西。如果你想要一个具有裸数据的对象,那么全公共结构也可以。


0
投票

在从getWidth()这样的属性类型方法返回指向整数的指针时,我无法想到这一点。它增加了必须跟踪内存所有权的负担;但实际上可能会增加返回类型的带宽(int和指针大小都是特定于平台的,并且可以且确实有所不同,但典型的大小分别为32位和64位)。

© www.soinside.com 2019 - 2024. All rights reserved.