如何在OOP C 中使用const类型类

How to use Const Type Class in OOP C++?

本文关键字:const 类型 OOP      更新时间:2023-10-16

您能解释一下为什么我不能在类中使用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::arraystd::vector,以确保您的数组不可变。

std::vector作为容器失败的汇编演示。

const Array &A表示A对象应被视为常数,因此无法修改其成员;但是其他对象(例如A.Arr指向的数组中的对象)不是。

n = 10;是不可能的,不是因为Aconst,而是因为朋友功能不是成员,因此没有nconst将阻止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

这样,您不再需要弄乱该朋友的功能。