常量关键字和重复方法签名
const keyword and duplicate method signature
我刚开始学习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非常量版本将是错误的。
相关文章:
- 是否有一种有效的方法来搜索队列中的关键字并覆盖其值
- 派生类中的方法在引用的类中没有 *virtual* 关键字的情况下执行
- C++ - 方法和重载中的常量关键字
- 如何在方法中使用 make "using" 关键字以接受它作为类级别
- 如何调用孩子的方法:虚拟关键字不起作用
- 'override'关键字只是对被覆盖的虚拟方法的检查吗?
- 我们可以通过在C++中的类中使用关键字“abstract”使所有方法抽象来声明接口类吗
- 有没有一种方法可以在枚举中使用关键字作为标识符
- 何时在带有头文件和目标文件的类方法中使用“inline”关键字
- 虚拟继承:当只有一个基类具有"虚拟"关键字时,为什么它有效?有没有更好的方法?
- 使用可视化C++环境和"Asm"关键字作为汇编程序 IDE 的替代方法?
- 使用关键字公开受保护的重载方法
- 除非指定关键字,否则无法调用 getter 方法 "this"
- 不能对 c++ 类实现文件中的静态方法使用 "static" 关键字 (.cpp)
- 如果在头文件中定义方法,内联关键字有什么用?
- 避免在使用"new"关键字后不断取消引用的标准方法是什么?
- 使用'virtual'和'override'关键字声明重写的方法是好还是坏?
- 在方法定义中使用内联关键字可能会导致问题
- 使用const关键字重载签名相同的方法
- Virtual 关键字使派生对象中的方法无法访问