我对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;
}
答案 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 的数组。成员函数的常量或对象的常量不会传递给间接指向的对象。