C++ 中 const 重载有啥用?

Posted

技术标签:

【中文标题】C++ 中 const 重载有啥用?【英文标题】:What is the use of const overloading in C++?C++ 中 const 重载有什么用? 【发布时间】:2010-09-20 01:15:19 【问题描述】:

在 C++ 中,函数的签名部分取决于它是否为 const。这意味着一个类可以有两个具有相同签名的成员函数,除了一个是 const 而另一个不是。如果你有一个这样的类,那么编译器将根据你调用它的对象来决定调用哪个函数:如果它是类的 const 实例,将调用函数的 const 版本;如果对象不是 const,则将调用另一个版本。

您希望在什么情况下使用此功能?

【问题讨论】:

【参考方案1】:

这只有在成员函数返回一个指针或对类的数据成员(或成员的成员,或成员的成员,...等)的引用时才有意义。通常不赞成返回非常量指针或对数据成员的引用,但有时它是合理的,或者只是非常方便(例如 [] 运算符)。在这种情况下,您需要提供一个 const 和一个非常量版本的 getter。这样,是否可以修改对象的决定取决于使用它的函数,该函数可以选择将其声明为 const 或 non-const。

【讨论】:

【参考方案2】:

它在那里,因此您可以让编译器强制您返回一个 const 对象还是一个常规对象,并且仍然保持相同的方法签名。 Const Correctness有深入的解释。

【讨论】:

【参考方案3】:

看看 std::map::operator[] 的行为。如果您尝试引用无效键,则 const 版本会引发错误,但非 const 版本会执行插入操作。插入行为比必须使用 std::map::insert 更方便(而且会进行覆盖),但不能用于 const 映射。

【讨论】:

【参考方案4】:

您可能希望使用它来决定是否返回对对象的 const 引用。 STL 的容器使用一个 const 重载的 begin() 和 end() 函数来决定是返回一个 const_iterator 还是一个普通的迭代器。

【讨论】:

【参考方案5】:
#include <iostream>
using namespace std;
class base


public:
void fun() const

    cout<<"have fun";

void fun()

    cout<<"non const";


;
int main()

    base b1;
    b1.fun(); //does not give error
    return 0;

这里编译器不会给出任何错误,因为在const 函数的情况下,编译器会将this 指针转换为const this*。第三个参数将这两个函数分开。

【讨论】:

您根本没有解释为什么成员函数需要const 限定符。

以上是关于C++ 中 const 重载有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 函数重载有啥用?

java中重载有啥用

qt setfixedsize有啥用

const 成员函数的重载解析 C++

c++中Std有啥用

c++重载时const的作用