15

如果我要在 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;
};

我意识到这些将允许您访问成员数据,但我不关心这个简单示例中的正确封装。那么有什么区别呢?加速?可读性?风格?

4

4 回答 4

22

&在这种情况下)并不意味着“地址”。

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

你可以通过返回一个指针来达到同样的效果,但是会有两个显着的区别:

  • 指针需要特殊的语法才能访问(*->运算符),而引用的使用方式与您使用对象本身的方式完全相同。
  • 指针可以null,引用不能。因此,任何时候使用指针,您都是在向代码的读者发出信号,“这个值可能是null
于 2011-04-04T17:18:50.640 回答
10

在这种情况下,&表示引用 - 而不是地址。

  • 指针可以为 0 - 在格式良好的程序中,引用不能。
  • 当您返回指针时,所有权可能会更不清楚。
  • 可读性是主观的 - 我会说尽可能使用参考。
  • 就效率而言,没有真正的区别。
于 2011-04-04T17:17:11.763 回答
0

首先,& 形式在 C++ 中被称为“引用”。* 形式称为“指针”或“地址”。

加速 - 没有区别。可读性 - 可能对引用有一点优势,在 upstack 代码中没有取消引用。

风格 - 显式破坏封装的风格足以掩盖其他任何东西。如果您想要一个包含裸数据的对象,那么一个全公共结构也可以。

于 2011-04-04T17:20:01.343 回答
0

There's no benefit I can think of in returning a pointer to an integer from a property-type method such as getWidth(). It adds the burden of having to track memory ownership; but is actually likely to increase the bandwidth of the return type (both int and pointer sizes are platform specific, and can and do vary, but typical sizes are 32 and 64 bits respectively).

于 2011-04-04T17:21:52.623 回答