2010-06-17 41 views
1

這個代碼是如何在一個const函數修改的值:const成員函數Vs的常量友元函數

#include<iostream> 
using namespace std; 
class Y; 
class X{ 
    public: 
    void access(Y &y) const; 
}; 

class Y{ 
    int d; 
    public: 
    friend void X::access(Y &y) const; 
    Y(){d=0;} 
}; 

void X::access(Y &y) const 
{ 
    cout<<"Y is "<<y.d<<endl; 
    y.d=1; 
    cout<<"Y is "<<y.d<<endl; 
} 

int main() { 
    X x; 
    Y y; 
    x.access(y); 
} 

而且這個代碼給出了一個錯誤:

#include<iostream> 

using namespace std; 

class Y{ 
    int d; 
    public: 
    void set() const{d=0;} 
};       

int main() { 
    Y y1; 
    return 0; 
} 
+0

在未來,請發表您的代碼中的問題,並沒有鏈接到它在外部網站上。 – 2010-06-17 14:18:26

回答

2

因爲const函數裏面,只有*thisconst,而不是傳遞給函數或其他任何參數。

2

在第一個示例中,X::access(Y &y) const上的const限定符意味着它所調用的對象X無法修改。由於Y參數是由非const引用拍攝的,因此可以從該函數內進行修改。

在第二示例中,上Y::set() const的const修飾符意味着在其上稱爲Y對象不能被修改,因此,爲什麼不能修改該非可變成員變量d

2

一個成員函數是const只承諾不改變它所屬的類的任何成員(如果它們聲明爲可變,則執行)。

在第一個示例中,Y.d正在方法X :: access中修改。該方法不會修改X本身的任何成員,因此完全理智。

但在第二個示例中,Y :: set()方法被聲明爲const,因此它不能更改Y :: d。

下一次,請在此處發佈代碼而不是提供鏈接。

+1

我不同意這一行: 成員函數是const,它只承諾不更改它所屬的類的任何成員(如果它們聲明爲可變,則執行它)。 函數中的const限定符不允許調用該函數的Object被修改。 所以我想你的答案是模棱兩可的! 因爲這個作品: x1。訪問(2次); – Sadique 2010-06-17 15:48:12

+0

你是對的,它有點含糊不清。用「正常」語言描述標準並不容易。 – stijn 2010-06-18 07:32:35

4

因爲你的第一個例子:

void X::access(Y &y) const; 

const告訴該函數將不會修改class X對象隱含this參數指向編譯器。作爲參考傳遞的class Y對象不是const

在第二個例子中,set()函數是class Y的成員:

void set() const 

和它被聲明爲使得隱this參數指向到Y對象是一個常量指針(使得對象不能被修改)。

如果你想X::access()不被允許修改傳遞給它的Y對象,更改聲明:

void X::access(Y const& y) const;