71

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

在什么情况下您可能想利用此功能?

4

5 回答 5

39

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

于 2008-10-30T18:20:40.740 回答
26

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

于 2008-10-30T18:06:25.683 回答
9

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

于 2008-10-31T10:32:46.630 回答
5

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

于 2008-10-30T18:07:43.280 回答
-2
#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*. 第三个参数将这两个函数分开。

于 2019-11-24T09:48:42.133 回答