混淆一个调用非const函数的const函数

时间:2011-04-09 15:56:57

标签: c++ const

基本上我定义了三个类:paralelogrampointline类,paralelogram有一些vectorpoint s和line s,在paralelogram类中,我将compute_area函数定义为

double Paralelogram::compute_area() const
{
  assert( !points.empty() );
  double h = points[3].distance_to_line( lines[0] ); // point[3] is the last point in
                                                     // the vector however it is not a
                                                     // const object, and this gives a
                                                     // compile time error
  double base = points[0].distance_to_point( points[1] );
  return base*h;
}

修改distance_to_line功能不是 - const

double Point::distance_to_line(Line& l)
{
  return l.distance_to_point(*this);
}

从函数定义和声明中删除const可以解决问题,但是我在编码时的推理compute_area不会修改对象,因此它可以是const,但是这样是正确的,只要它在const个对象上运行并调用const个对象的函数,对吗?

如果point对象也不是const,则此信息不再有效。由于它们不是const,因此const移除后它才起作用。

对于我来说,这是一个令人费解的点,我不修改对象,但是它使用的对象会产生问题,而且我在想的是我仍然没有改变这些对象,但显然我的问题很混乱{ {1}}理解。还有一件事,如果你能澄清的话,这是否与const类的this指针有某种关系?

4 个答案:

答案 0 :(得分:3)

在const函数中,每个成员的类型都变成const,你不能修改它们(除非它们被声明为mutable),你也不能调用任何非成员const函数使用它们。

似乎在你的代码中,distance_to_line是非const函数,但你是从const函数调用它,这意味着在const函数points[3]和{{1成为const对象,所以你不能在const对象上调用非const函数(我相信points[0])。

-

编辑:

你需要使distance_to_line成为一个const函数,并且由于这个函数调用distance_to_line,你必须使distance_to_point const函数成为偶数。

答案 1 :(得分:1)

要使成员函数为const,您也不需要将成员变量设为const。您只需要确保const函数不会修改类的任何成员变量。

您是否尝试在点类上创建distance_to_line()函数const?如果有效,你也可能需要制作distance_to_point() const。如果这些不是const,则编译器无法确保调用函数也是const。

答案 2 :(得分:1)

点击distance_to_line()distance_to_point() const,您的错误就会消失。

答案 3 :(得分:1)

通过声明函数const,您还限制了对任何成员的访问权限 - 它们也会被视为const。由于您无法在const对象上调用非const成员函数,因此这些调用将失败。