void foo(const ClassName &name)
{
...
}
如何访问类实例名的方法?
name.method()
无效。然后我试了一下:
void foo(const ClassName &name)
{
ClassName temp = name;
... ....
}
我可以使用temp.method,但是foo执行后,原来的名字搞砸了,任何想法? BTW,名称的成员变量没有搞砸,但它是类的子类的成员变量搞砸了。
答案 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()
。如果由于某种原因你不能,我会看到以下方式:
const
作为非const方法参数。name
的非常量副本,并在其上调用name
- 就像您实际做的那样。但是,仅当为method
正确实现赋值运算符和/或复制构造函数时,此方法才有效。但是,你在执行foo之后写了“,原来的名字搞砸了”,这是一个非常模糊的描述,但它可以解释为复制确实对{{1}有一些不必要的副作用},这表明这些功能没有正确实现或根本没有实现。ClassName
抛弃constness - 这应该真的是最后的手段,并且只有当你确定name
实际上没有改变任何状态。Update2 ,@ @ AKN的评论 - 抛弃constness的例子:
const_cast