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

时间:2018-02-16 10:11:36

标签: c++ c++11

我对CPP有点新手,我不知道为什么setValue() 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;
}

3 个答案:

答案 0 :(得分:17)

这是因为你没有修改它。当你这样做时:

int* tab

标签只包含一个地址。然后在

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

您不修改此地址,之后修改一些内存。因此,您不会修改您的课程。

相反,如果您使用

std::vector<int> tab

你会在setValue中出错,因为你会修改你的类的元素。

答案 1 :(得分:6)

首先,不要明确地调用类的析构函数,当变量自动超出范围时,将调用它。

  

darray〜DArray();

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

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

  

错误:在只读对象

中分配成员'DArray :: tab'

答案 2 :(得分:2)

  

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

可以修改对象的可变状态。技术上也可以使用const_cast修改非可变状态,但这样做是个坏主意,因为如果对象本身是const,那么行为将是未定义的。

然而,这不是你在这段代码中所做的。

  

为什么setValue()const同时工作,它是一个const。

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