如何在OOP C 中使用const类型类
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()
中的元素也可更改,但是当我尝试使用代码行A.n = 10
时,它是不可变的。
也许我应该定义const
过载操作员或其他内容,以使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
指向的数组中的对象)不是。
n = 10;
是不可能的,不是因为A
是const
,而是因为朋友功能不是成员,因此没有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
可变时才能用于修改。
只是为了完成答案,由于您的课程命名为Array
,因此您应该相应地将数组订阅运算符超载:
int &operator[](int index) { return Arr[index]; } // non-const overload
int operator[](int index) const { return Arr[index]; } // const overload
这样,您不再需要弄乱该朋友的功能。
相关文章:
- 在函数中使用运算符重载,在 c++ 中使用 const 类型输入参数
- 成员函数的"this"参数具有"const"类型,但我的函数实际上不是"const"
- 将 const 类型引用对象注册为类成员对象C++
- 为什么不能在模板函数中向局部变量添加低级 const 类型
- 对于 const 类型,没有可行的重载运算符 []
- 为什么在auto和template函数的情况下,类型都没有推导为"const"类型
- 如何在OOP C 中使用const类型类
- 特征矩阵const类型
- 如何在静态方法中返回const类型
- const类型容器的const_iterator类型
- C++:当返回类成员变量的地址时,编译器强制其为const *类型
- 类型绑定引用中的限定符和 const 类型的初始值设定项中删除
- 在 main 中初始化类的 "static const" 类型变量成员的更好方法
- 正在检查是否有const类型
- 为什么我们能够在类定义中定义[static const int],而不能定义其他静态const类型
- 了解一些涉及 const 类型的C++代码
- c++ 11中的const类型转换为const别名
- 为什么将const类型的智能指针强制转换为类型的智能指针有效?
- STL:为"const T &"类型调用带有ptr_fun的 bind2nd
- 我应该什么时候传递"T* const&"类型的指针?