const对C ++中的复合类型(带引用)究竟是什么?

时间:2018-05-07 10:55:28

标签: c++ language-lawyer

编辑:

这个问题没有答案^^there,因为它只是说

  

通过将变量声明为const,可以指示您拥有的编译器   无意修改该变量。

“修改”是什么意思?更改指定值?如果它是一个复合对象怎么办 - 如何更改其数据成员(将无法工作),但如果数据成员是一个引用更改它即使包含对象是const也会工作?为什么呢?

我知道“无法修改此类对象”,并且“通过将变量声明为const指示编译器您无意修改该变量。”当对象不是基本类型但是是复合类型时,我对“修改”的意思感兴趣,除了它的值数据成员之外,它还有引用和指针。

cppreference只说

  

此类对象无法修改

“对象”或“修改”是与内存表示相关的技术术语还是什么?试验表明,如果对象数据成员是指针或引用,则可以修改它们表示的数据。

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会发生什么。

其数据成员:

  1. object是原始数据类型(但是非指针和非引用) - >回答^^there
  2. object是一个指针 - > SomeObj *变为SomeObj * const
  3. 对象是参考 - > someObj中和放大器;保持不变
  4. object是复合数据类型 - >使用这些规则“标记”其所有成员const
  5. 虽然为什么它的设计方式可能不明显。因此,不应该将引用视为可以以任何方式实现的黑盒类型。

    有人认为引用只是非常不变的指针,只考虑它们的实现而不是参考黑盒子。否则它永远不会有意义,引用不是更接近值类型而不是指针,它们是指针。 语法它们可能类似于值类型,但语义实现方式它们是常量指针。

0 个答案:

没有答案