为什么我可以在C 11中使用const函数修改类
Why can I modify the class with a const function in C++11?
我对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不传递到间接指向对象。
- 在 const 函数中通过引用和指针返回之间的区别
- 使用 std::string () const 函数启动线程或未来
- 如果我在 const 函数上使用指针,我可以返回什么?
- 为什么 const 函数返回左值而不是右值?
- 当我调用 main 中使用 const 对象的 const 函数时,不断出现错误
- 在 const 对象上调用非 const 函数
- 析构函数是否可以在 const 对象上调用非 const 函数
- C/C++ 如何在一次函数调用中交出 const 函数指针或简单指针
- 为什么我可以在C 11中使用const函数修改类
- 防止const函数被调用非const对象
- 如果C 中的支架重载运算符被声明为const函数
- C++:防止在 const 函数中更改指针的值
- 从const函数返回非const属性参考
- 调用指针参数从const函数指向的对象的操作员
- 在const函数中调用非CONST成员的非const函数
- 无法将 const 数据类型传递到非 const 函数中
- 这是检查 const 函数(如果是否创建某些内容)的更好方法
- 在 const 函数中从地图中未经选中读取
- 编译器不会为 "const" 和"not-const"函数给出不明确的错误吗
- 通过const函数中的参数索引返回std :: map的值