为什么我可以在C 11中使用const函数修改类

Why can I modify the class with a const function in C++11?

本文关键字:const 函数 修改 我可以 为什么      更新时间:2023-10-16

我对CPP有点新手,我不知道setValue() const为什么可以工作,同时它是一个const。

为什么该类允许从const public

进行修改

似乎真的很奇怪,在G -WALL或MS Visual C

上没有错误

这是我的代码:

main.cpp

#include <iostream>
#include <cassert>
#include "DArray.h"
int main(void)
{
    DArray darray(1);
    darray.setValue(0, 42);
    assert(darray.getValue(0) == 42);
    darray.~DArray();
    system("pause");
    return 0;
}

darray.h

class DArray
{
private:
    int* tab;
public:
    DArray();
    DArray(unsigned int n);
    ~DArray();
    int& getValue(unsigned int n) const;
    void setValue(unsigned int n, int value) const;
};

darray.cpp

#include "DArray.h"
DArray::DArray()
{
}
DArray::DArray(unsigned int n)
{
    tab = new int[n];
}
DArray::~DArray()
{
    delete[] tab;
    tab = nullptr;
}
int& DArray::getValue(unsigned n) const
{
    return tab[n];
}
void DArray::setValue(unsigned n, int value) const // HERE
{
    tab[n] = value;
}

这是因为您不修改它。当您这样做时:

int* tab

选项卡仅包含一个地址。然后在

void DArray::setValue(unsigned n, int value) const // HERE
{
    tab[n] = value;
}

您没有修改此地址,在其之后修改了一些内存。因此,您不修改课程。

相反,您使用了

std::vector<int> tab

您会在setValue中遇到错误,因为您会修改类的元素。

首先,请勿明确称呼您的类的破坏者,当变量自动脱离范围时,这将被调用。

darray 。〜darray((;

在方法中,您有望使用const的承诺是将不会修改成员变量。变量int* tab是指向INT的指针。使用您的setValue函数,您不会更改指针的地址(在您的方法的签名中,最终const保证不会更改它(,而是由其指向其指向的int值。这可以。

但是,如果您更改指针地址,例如使用tab = nullptr,您将看到一个编译器错误:

错误:在只读对象中的成员'darray :: tab'的分配

为什么我可以在C 11中使用const函数修改类?

可以修改对象的可变状态。从技术上讲,也可以使用const_cast修改不可误差状态,但是这样做是一个坏主意,因为如果对象本身是const,则行为将不确定。

这不是您在此代码中所做的。

为什么setValue((const起作用同时是一个const。

因为它不会修改this的任何成员。它修改了一个由指向非const 指向的数组。成员函数的构成或对象的constness不传递到间接指向对象。