[英]How to use Const Type Class in 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()
中的元素也是可以更改的,但是當我嘗試使用代碼行An = 10
,它是不可變的。
也許我應該定義一個const
重載運算符或其他東西,以使Arr
所有元素都不Arr
。
問題:如何使Arr
元素不可變?
也許我應該定義一個'const'重載運算符或其他東西,以使'Arr'中的所有元素都是不可變的。
A.Arr[i]
在你的情況下不是一成不變的。 A.Arr
是。
您不能執行以下操作:
A.Arr = newaddress;
++A.Arr; // etc
要克服這個問題,擺脫C風格指針(動態內存)並使用:
int Arr[somesize];
或者像std::array
或std::vector
這樣的容器,以確保您的數組是不可變的。
使用std::vector
作為容器編譯失敗的實時演示 。
const Array &A
意味着A
對象被視為常量,因此其成員不能被修改; 但是其他對象,例如A.Arr
指向的數組中的A.Arr
,則不是。
n = 10;
是不可能的,因為A
是const
,但因為朋友的功能不是成員,所以沒有n
。 const
會阻止An = 10;
您可以通過僅允許通過成員函數訪問而不是通過指針來阻止對數組的修改:
public:
Type & operator[](size_t i) {return Arr[i];}
Type const & operator[](size_t i) const {return Arr[i];}
現在,如果A
是可變的, A[i]
只能用於修改。
只是為了完成答案,因為你的類被命名為Array
,你應該相應地重載數組下標運算符:
int &operator[](int index) { return Arr[index]; } // non-const overload
int operator[](int index) const { return Arr[index]; } // const overload
有了它,你將不再需要弄亂那個朋友的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.