2015-09-07 58 views
-2

這是代碼。這個指針如何在數組中工作?

#include <iostream> 

using namespace std; 

int w=0; 

class A{ 
    int k,n; 
public: 
    int z; 
    A(){w+=3; k=3+w; n=4+w; z=w;} 
    A *fun1(){z=k*n; return this;} 
    A *fun2(){z=n*k; return this-1;} 
    friend int fun (A *a,int &b); 
}; 

int fun(A *a,int &b) 
{ b=a->z+=4; 
    return a->k+a->n; 
} 

int main() 
{ int m; 
    A a[2]; 
    cout<<fun(a[1].fun1(),m)<<"\n"; 
    cout<<m<<"\n"; 
    cout<<fun(a[1].fun2(),m)<<"\n"; 
    cout<<m<<"\n"; 
    cout<<a[0].z+a[1].z<<"\n"; 
    return 0; 
} 

當返回this-1時,這是什麼意思?這是否意味着返回的對象是[0]?我聽不懂.. 謝謝!

+0

是的,當你調用'a [1] .fun2()'然後'返回這個-1;'確實是'a [0]'。 事實上'this'這裏指'a [1]'和'A a [2];'在'A'元素的內存中聲明一個連續的數組。 – coincoin

+0

那麼如果我給'a [0]'然後'返回這個-1'呢?作爲回報的價值將是內存的價值? – mitsoschelsea

+0

您將超出數組大小,因此行爲未定義。 – Estiny

回答

3

像任何指針,從this減去1假設*this是數組的一個元素,給出陣列中的前述對象的地址。在A::fun2()中有一個隱含的假設,*this是一個數組的元素,並且該數組中至少有一個前面的元素。

因此,在您的示例代碼中,a[1].fun2()返回地址a[0]。即&a[0]

a[0].fun2()將返回等於&a[-1]的(指針)值。從概念上講,這是一個指向一個不存在的對象的指針。在A::fun2()中計算this-1將給出未定義的行爲,就像計算a-1將在main()中一樣。這種未定義行爲的一個常見(但不是保證)的實際症狀是稍後解引用指針時程序崩潰。

+0

其實,我相信從一個指向數組開頭的指針中減去一個實際上是未定義的行爲。 (當然,除非該數組是一個更大的對象的一部分) – Hurkyl

+0

爲什麼會這樣?你只是從一個值中減去,而不是訪問任何內存。 – emlai

+3

嗯,這裏我們根據Additive Operators'[expr.add]'進行操作:如果指針操作數和結果指向同一個數組對象的元素,或者數組對象的最後一個元素,則評估應該不會產生溢流;否則,行爲是 未定義。「 – Hurkyl

-3

A fun2(){z = n k; return this-1;}

'this'是一個自引用指針。你不能從中減去1。 它將然後指向的存儲器位置是一個前this指針

+1

如果結果指向同一個數組對象內部,那麼這是很好定義的。 – TartanLlama

+1

當然可以。這可能是危險的,但並不禁止。 –