常量关键字和重复方法签名

const keyword and duplicate method signature

本文关键字:方法 关键字 常量      更新时间:2023-10-16

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

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

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

有两件事让我感到困惑。

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

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

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

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

在网络和SO中搜索"常量正确性"。

几种方法可以使用指针在变量中声明 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

至于问题,这两个方法定义是重载,调用哪一个取决于上下文。 例如,如果调用方也在 data() 方法中,并且调用它的成员之一(该成员是具有 const char * data() const 方法的类的实例化(,则将调用 const char * 方法,并且调用方只能将返回值保存在 bar 类型的变量中。 下面是一个示例:

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

下面是一个需要两者的示例。

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.

由于const是一个data()对象,因此调用CC_14非常量版本将是错误的。