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