const关键字和重复方法签名

时间:2013-04-18 19:39:16

标签: c++

我刚开始学习C ++,从JAVA环境切换。

在阅读一些Boost示例时,我发现在类中定义了以下两种方法:

const char* data() const
{
    return data_;
}

char* data()
{
  return data_;
}

有两件事令我困惑。

首先是保留字const,我想我在这里理解。第一个const引用char*,这意味着我无法更改指针的值。第二个const告诉我,调用该函数不会改变我调用的对象的状态。这是正确的解释吗?

第二点混淆是为什么有两个具有相同名称和签名的方法。编译器如何知道我打算调用哪一个?我怎么知道在调用data()之后我是否被允许更改数据而不知道我打了哪两个?

3 个答案:

答案 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.

因为barconst对象,所以调用data()非const版本会出错。