【问题标题】:c++ passing by const referencec++ 通过 const 引用传递
【发布时间】:2012-06-14 03:46:28
【问题描述】:

在下面的程序体中包含一个指针向量。 Points 是 x,y,z 坐标和 point_id 的结构。我相信由于 body 是通过 const 引用传递的,因此以下步骤应该会产生错误。但是程序运行没有任何问题。你能解释一下为什么会这样吗?

void readOutFile(const Body& body, int n){

    ....

    body.bp[0]->points.push_back(Point_id(p,i));
}

【问题讨论】:

  • body 作为const 传递,但编译器无法知道body.bp[0]->points 也应该是const
  • 它会运行正常,而 const 错误将是编译时错误,而不是运行时错误。
  • 在 C++ 中,const 是浅的,而不是深的。所以它影响对象但不影响它的关联。这意味着您只能调用 const 方法。但是 const 方法可以改变其他对象,总是使用接口中的方法,并使用一个好的 lint 工具来检查深层 const。
  • @richard const is shallow 是什么意思?是否有概念:浅常量和深常量?
  • 深浅常量,就像深浅拷贝。浅是指单独的对象。深指对象及其所指的所有对象。 IE。浅 const 集合/对象是变体对象的不变集合/对象。深 const 集合/对象是深 const 对象的不变集合/对象。 (注意递归定义)。还要注意,如果一个对象是深常量,它将通过浅常量测试。 (副本不是这样)

标签: c++ pass-by-const-reference


【解决方案1】:

这是说明data members should not be public 原因的最佳示例之一。

这里,body 是常量,因此它的数据成员不能更改,但在 body.bp[0]->points 中,点正在更改,它不是 Body 的成员。因此不会违反 const。

【讨论】:

  • 对我来说,这是为什么成员指针不应该公开的一个例子。公共“价值”数据成员没有任何问题。
【解决方案2】:

问题来了:

body.bp[0]->points.push_back(Point_id(p,i));
          ^^

通过指针间接删除任何常量;相反,结果的常量取决于指针的类型。

T *t;              // pointer to T: can modify t and (*t)
const T *t;        // pointer to const-T: can modify t but not (*t)
T *const t;        // const-pointer to T: can modify (*t) but not t
const T *const t;  // const-pointer to const-T: can't modify either t or (*t)

【讨论】:

  • 我从来没有意识到这一点,但这是有道理的。常量会传播到成员指针,但不会传播到它的内容。
【解决方案3】:

是的,body 是不变的。这意味着不能调用非常量成员函数,也不能修改成员变量。

两者都没有完成。 body 唯一使用的成员是body.bp[0],它也没有改变,只是用来获取points,它可能是也可能不是恒定的......

推论:不要公开数据成员。

【讨论】:

    【解决方案4】:

    只有body 是不变的。

    body.bp[0]->points 不受body恒定性影响

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      相关资源
      最近更新 更多