3

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

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

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

char* data()
{
  return data_;
}

有两件事让我感到困惑。

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

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

4

3 回答 3

6

第一个函数返回一个指向常量数据的指针。const函数签名末尾的 表示该函数不会修改和类数据成员 。

第二个函数返回一个指向可变数据的指针。调用者可以使用指针来修改类成员变量。

在网上搜索“常量正确性”。

于 2013-04-18T19:43:07.427 回答
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()方法的类的实例化),那么该const char * data() const方法将被调用,调用者只能保存返回值在类型的变量中const char *。这是一个例子:

class MyClass {
  DataClass data_obj_;   // has both 'data()' methods described in your question
...
  void my_method () const {  // within this const method, data_obj_ cannot be modified
    const char * data = data_obj_.data();  // calls const method
...
于 2013-04-18T19:43:28.073 回答
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()

于 2013-04-18T19:50:12.403 回答