2014-06-30 135 views
-1

下面是一个简单的代码:运算符重载返回类型

Iterator& operator=(const Iterator& other) 
{ 
    node_ = other.node_; 
    return(*this); // This clearly is a value 
    } 

在此我们承诺该函数将返回引用到迭代器数据类型。

但是我们返回一个值 ...这是如何工作..... ??

在许多例子中看到了这一点:

T& operator[] (unsigned int index) 
{ 
    if (index >= numEle) 
     return ptr[0]; // This clearly is a value 
    else 
     return ptr[index]; 
} 

它是一种非常天真的疑问,但不能真正地理解它是如何工作的.....

+0

你为什么说这是一个价值?它返回一个参考!为什么?因为编译器会看到你的函数签名,并且足够聪明以返回一个引用而不是值,所以根据函数的返回类型 – Sheen

+1

引用**总是**从一个值创建。转换为引用类型是自动的。 –

+0

*(this)是这个指针所指向的值......那个引用是如何的...? – PRP

回答

2

参考T&表示T类型的对象。因此,我们总是初始化参考T&T类型的对象:

int x = 5; 
int& r = x; 

在你的情况下,返回类型为Iterator&,所以你返回Iterator对象。

当然,你可以初始化参考T&与另一T&为其他参考表示T类型的对象:

int& r2 = r; 
0

你应该知道,数组元素并取消引用指针可以用作赋值运算符的左和右操作数。它可以被视为变量和价值。

int arr[5] = {0}; 
int x = a[2];  // a[2] is on right side of `=` 
a[2] = 5;   // a[2] is on left side of `=` 

int *p; 
p = &arr[0]; 
*p = 10;   // *p is on left side of `=` 
a[1] = *p;   // *p is on right side of `=` 

所以,当函数的返回类型只是一个类型,那么return语句返回值。当函数的返回类型为时,参考为一个变量,则return语句返回参考为一个变量。

+0

我不太确定在这些例子中''[2]'是否是一个右值! – juanchopanza

+0

@juanchopanza;我在这点上有点弱,因为在C中只有l值和r值。但在C++中,有l,r和pr值,有时我会感到困惑。我的意图很清楚,'a [2]'可以用于'=':)的任一侧 – haccks

0

这是不是返回一个值,它做广告:返回参考(值)。