传递类的const引用

时间:2010-05-21 08:33:44

标签: c++

void foo(const ClassName &name)
{
    ...
}

如何访问类实例名的方法?

name.method()无效。然后我试了一下:

void foo(const ClassName &name)
{
    ClassName temp = name;
    ... ....
}

我可以使用temp.method,但是foo执行后,原来的名字搞砸了,任何想法? BTW,名称的成员变量没有搞砸,但它是类的子类的成员变量搞砸了。

2 个答案:

答案 0 :(得分:6)

根据您提供的说明,method()中的ClassName似乎是非const方法。如果您尝试在const对象上调用非const方法,编译器将抛出错误。当您执行ClassName temp = name;时,您将变量的副本创建为临时非const对象temp。您可以在此对象上调用任何方法,但由于它是副本,因此对此对象执行的修改不会反映在name对象中。

修改

解决此问题的最佳方法是,如果ClassName::method const不修改任何成员变量,则使其成为常量。如果是,则不应将函数foo中的参数作为const引用。您应该将参数作为非const引用。

答案 1 :(得分:4)

如果我理解正确,你想在name.method()内调用foo(),编译器不允许你。任何机会ClassName::method()都是非const方法吗?由于name被声明为const的{​​{1}}参数,因此您只能在其上调用foo()个函数。

更新:如果const是非常量的,但实际上并未改变状态,那么最好将其设为ClassName::method()。如果由于某种原因你不能,我会看到以下方式:

  • (显而易见的是,@ Naveen指出 - 谢谢:-)声明const作为非const方法参数。
  • 制作name的非常量副本,并在其上调用name - 就像您实际做的那样。但是,仅当为method正确实现赋值运算符和/或复制构造函数时,此方法才有效。但是,你在执行foo之后写了“,原来的名字搞砸了”,这是一个非常模糊的描述,但它可以解释为复制确实对{{1}有一些不必要的副作用},这表明这些功能没有正确实现或根本没有实现。
  • (令人讨厌的方式)用ClassName抛弃constness - 这应该真的是最后的手段,并且只有当你确定name实际上没有改变任何状态。

Update2 ,@ @ AKN的评论 - 抛弃constness的例子:

const_cast