如果我要在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;
};
我意识到这些将允许您访问成员数据,但我并不关心这个简单示例中的正确封装。那么差异是什么?加速?可读性?风格?
答案 0 :(得分:22)
&
(在此上下文中)并不代表“地址”。
声明为string& getName( );
的函数返回引用,而不是指针。引用本质上是另一个对象的别名。因此,在这种情况下,它不会返回对象名称的副本或指向名称的指针,而是返回名称本身的引用。因此,对返回对象的任何更改都将直接应用于对象的名称。
您可以通过返回指针来实现相同的目标,但是存在两个显着差异:
*
和->
运算符),而引用的使用方式与使用对象本身完全相同。null
,参考不能。因此,无论何时使用指针,您都会向读者发出“此值可能为null
”的代码信号。答案 1 :(得分:9)
在此上下文中,&
表示引用 - 而不是地址。
答案 2 :(得分:0)
首先,& form在C ++中称为“引用”。 *表单称为“指针”或 “地址”。
加速 - 没有区别。可读性 - 对于引用可能略有优势,在upstack代码中没有derefencing。
样式 - 显式破坏封装是足够糟糕的风格来掩盖任何其他东西。如果你想要一个具有裸数据的对象,那么全公共结构也可以。
答案 3 :(得分:0)
从属性类型方法(例如getWidth()
)返回指向整数的指针时,我无法想到。它增加了必须跟踪内存所有权的负担;但实际上可能会增加返回类型的带宽(int
和指针大小都是特定于平台的,并且可以且确实有所不同,但典型的大小分别为32位和64位。)