2015-05-13 20 views
2

您能否解釋爲什麼我不能在課堂上使用const類型?如何在OOP C++中使用Const類型類?

示例代碼:

class Array { 
    int *Arr; 
    int n; 
public: 
    Array(int _n = 0) { 
     Arr = new int[_n]; 
     n = _n; 
    } 
    ~Array(void) { 
     delete []Arr; 
    } 
    friend void f(const Array &A) { 
     A.Arr[0] = 3; // why can the Arr[0], Arr[1] be changed the value ? 
     A.Arr[1] = 4; 
    // A.n = 10;  // can not be changed because of 'const class type' 
    } 
}; 

void main() 
{ 
    Array A(5); 
    f(A); 
} 

當我打電話f(A),我已經在f定義的const Array &A但在void f()的元件也是可變的,但是當我嘗試與代碼線A.n = 10,它是不可變的。

也許我應該定義一個const重載運算符或其他東西,以使Arr中的所有元素都是不可變的。

問題:如何讓Arr的元素不可變?

回答

4

const Array &A意味着A對象被視爲常量,因此其成員不能被修改;但其他對象(如A.Arr指向的數組中的那些對象)卻不是。

n = 10;是不可能的,不是因爲Aconst,但因爲朋友的功能是不是會員,所以沒有n。該const將防止A.n = 10;

您可以防止陣列的修改只允許通過成員函數訪問,而不是通過指針:

public: 
    Type  & operator[](size_t i)  {return Arr[i];} 
    Type const & operator[](size_t i) const {return Arr[i];} 

現在A[i]只能用於修改如果A是可變的。

+0

你說所有對象的成員使用const是不可變的。但爲什麼int * Arr是可變的?我可以強制指針int * Arr是不可變的嗎? –

+1

@安徒生:指針不可變。它指向的對象是,因爲'const'只適用於'array'對象。你不能阻止通過指針的可變訪問,但你可以添加'const'成員函數給它們的只讀訪問權限。 –

+0

你能爲我寫下代碼嗎?謝謝 –

6

也許我應該定義一個'const'重載操作符或 爲了使'Arr'中的所有元素都是不可變的。

A.Arr[i]在你的情況下是不可改變的。 A.Arr是。

你不能做到以下幾點:

A.Arr = newaddress; 
++A.Arr; // etc 

爲了克服這個問題,擺脫空調風格指針(動態內存)和使用:

int Arr[somesize]; 

或一些類似std::arraystd::vector容器確保你的數組是不可變的。

Live demo編譯失敗std::vector作爲容器。

+0

你的意思是「A.n is。」? – manuell

+1

@manuell不,我的意思是'A.Arr'地址是固定的,但不是它指向的內容。 –

+0

好的。然而,OP想要修改n。 – manuell

1

剛剛完成的答案,因爲你的類名爲Array,你應該有相應的重載數組下標操作:

int &operator[](int index) { return Arr[index]; } // non-const overload 

int operator[](int index) const { return Arr[index]; } // const overload 

有了這一點,你就不再有與該好友功能混亂。

+0

中的const超載,不是const隻影響函數嗎?之後返回的值仍然可以更改。 – Vladp

+1

@Vladp它返回一個副本 - 一個右值,你不能指定任何東西。也可以是'int const&',但是如果是基本類型,我會使用副本。 – LogicStuff

+0

但是當你調用Array [3]時,編譯器如何選擇使用哪個運算符重載?它是否依賴於該範圍內的數組是否爲const? – Vladp

相關問題