我刚开始学习C ++,从JAVA环境切换。
在阅读一些Boost示例时,我发现在类中定义了以下两种方法:
const char* data() const
{
return data_;
}
char* data()
{
return data_;
}
有两件事令我困惑。
首先是保留字const
,我想我在这里理解。第一个const
引用char*
,这意味着我无法更改指针的值。第二个const
告诉我,调用该函数不会改变我调用的对象的状态。这是正确的解释吗?
第二点混淆是为什么有两个具有相同名称和签名的方法。编译器如何知道我打算调用哪一个?我怎么知道在调用data()
之后我是否被允许更改数据而不知道我打了哪两个?
答案 0 :(得分:6)
第一个函数返回一个指向常量数据的指针。函数签名末尾的const
表示该函数不会修改和类数据成员。
第二个函数返回一个指向可变数据的指针。调用者可以使用指针来修改类成员变量。
在网上搜索SO以获取“const correctness”。
答案 1 :(得分:1)
有几种方法可以使用指针在变量中声明const:
const char * // you can modify the pointer, not the item pointed to
char const * // you can modify the pointer, not the item pointed to
char * const // you can modify the item pointed to, not the pointer
const char const * // you cannot modify either
char const * const // you cannot modify either
const char * const // you cannot modify either
至于问题,这两个方法定义是重载,调用哪一个取决于上下文。例如,如果调用者也在const
方法中,并且在其中一个成员(谁是具有data()
方法的类的实例化)上进行调用,那么{{1将调用方法,并且调用者只能将返回值保存在const char * data() const
类型的变量中。这是一个例子:
const char *
答案 2 :(得分:0)
以下是您需要两者的示例。
class foo {
char* data_;
public:
const char* data() const
{
return data_;
}
char* data()
{
return data_;
}
};
const foo bar;
foo bar2;
bar->data(); // this uses the const version.
bar2->data(); // this uses the non-const version.
因为bar
是const
对象,所以调用data()
非const版本会出错。