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

时间:2011-04-04 17:14:51

标签: c++ pointers reference coding-style address-operator

如果我要在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 个答案:

答案 0 :(得分:22)

&(在此上下文中)并不代表“地址”。

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

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

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

答案 1 :(得分:9)

在此上下文中,&表示引用 - 而不是地址。

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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