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

const重载在C++;? 在C++中,函数的签名部分取决于它是否是const。这意味着一个类可以有两个具有相同签名的成员函数,但一个是const,另一个不是。如果您有这样一个类,那么编译器将根据您调用它的对象来决定调用哪个函数:如果它是类的const实例,则将调用该函数的const版本;如果对象不是常量,则将调用另一个版本,c++,function,constants,overloading,C++,Function,Constants,Overloading,在什么情况下您可能希望利用此功能?它就在那里,这样您就可以让编译器强制执行您返回的是常量对象还是常规对象,并且仍然保持相同的方法签名。有一个深入的解释。您可能想用它来决定是否返回对对象的常量引用。STL容器使用常量重载的begin()和end()函数来决定是返回常量迭代器还是普通迭代器。只有当成员函数返回指向类的数据成员(或成员的成员,或成员的成员等)的指针或引用时,这才有意义。通常不赞成返回非常量指针或对数据成员的引用,但有时这是合理的,或者只是非常方便(例如,[]运算符)。在这种情况下,您将

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

它就在那里,这样您就可以让编译器强制执行您返回的是常量对象还是常规对象,并且仍然保持相同的方法签名。有一个深入的解释。

您可能想用它来决定是否返回对对象的常量引用。STL容器使用常量重载的begin()和end()函数来决定是返回常量迭代器还是普通迭代器。

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

看看std::map::operator[]的行为。如果尝试引用无效密钥,常量版本会抛出错误,而非常量版本会执行插入操作。插入行为比必须使用std::map::insert(而且会进行覆盖)要方便得多,但不能用于常量映射。

\include
#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;
}
使用名称空间std; 阶级基础 { 公众: void fun()常量 {
您可能还没有解释为什么成员函数上需要
const
限定符。