编辑:
这个问题没有答案^^there,因为它只是说
通过将变量声明为const,可以指示您拥有的编译器 无意修改该变量。
“修改”是什么意思?更改指定值?如果它是一个复合对象怎么办 - 如何更改其数据成员(将无法工作),但如果数据成员是一个引用更改它即使包含对象是const也会工作?为什么呢?
我知道“无法修改此类对象”,并且“通过将变量声明为const指示编译器您无意修改该变量。”当对象不是基本类型但是是复合类型时,我对“修改”的意思感兴趣,除了它的值数据成员之外,它还有引用和指针。
此类对象无法修改
“对象”或“修改”是与内存表示相关的技术术语还是什么?试验表明,如果对象数据成员是指针或引用,则可以修改它们表示的数据。
class Vector {
public:
Vector () : ptr(new int[20]) {}
void f() const {
ptr[0] = 100;
}
private:
int* const ptr;
};
上面的代码编译,执行const Vector v;
不会将const添加到int* const ptr
。
此外,如果数据成员是引用,谁知道引用是如何在内部实现的(如果标准中没有指定),那么const
根据标准做了什么?
我的答案:(也感谢评论中的信息)
声明对象const
时const MyObject obj();
或
__class definition__
private:
const MyObject obj;
你基本上说数据是直接属于内存中对象的一部分,不能改变。请记住,子对象(数据成员),子子对象......直接是内存中对象的一部分。
因此,在复合对象中,它以“深度const”方式“标记”所有成员也是常量,直到它仅下降到非复合类型。
但请记住,指针和引用不存储对象,它们只存储内存位置。因此,对于指针,您将获得一个常量指针,并且对于引用,没有任何更改(它们指向的内存位置,它们始终是常量)。
快速总结如果声明复合对象const会发生什么。
其数据成员:
虽然为什么它的设计方式可能不明显。因此,不应该将引用视为可以以任何方式实现的黑盒类型。
有人认为引用只是非常不变的指针,只考虑它们的实现而不是参考黑盒子。否则它永远不会有意义,引用不是更接近值类型而不是指针,它们是指针。 语法它们可能类似于值类型,但语义和实现方式它们是常量指针。