const重载在C++;? 在C++中,函数的签名部分取决于它是否是const。这意味着一个类可以有两个具有相同签名的成员函数,但一个是const,另一个不是。如果您有这样一个类,那么编译器将根据您调用它的对象来决定调用哪个函数:如果它是类的const实例,则将调用该函数的const版本;如果对象不是常量,则将调用另一个版本
在什么情况下您可能希望利用此功能?它就在那里,这样您就可以让编译器强制执行您返回的是常量对象还是常规对象,并且仍然保持相同的方法签名。有一个深入的解释。您可能想用它来决定是否返回对对象的常量引用。STL容器使用常量重载的begin()和end()函数来决定是返回常量迭代器还是普通迭代器。只有当成员函数返回指向类的数据成员(或成员的成员,或成员的成员等)的指针或引用时,这才有意义。通常不赞成返回非常量指针或对数据成员的引用,但有时这是合理的,或者只是非常方便(例如,[]运算符)。在这种情况下,您将提供getter的常量和非常量版本。这样,是否可以修改对象的决定取决于使用它的函数,该函数可以选择声明它为常量或非常量。看看std::map::operator[]的行为。如果尝试引用无效密钥,常量版本会抛出错误,而非常量版本会执行插入操作。插入行为比必须使用std::map::insert(而且会进行覆盖)要方便得多,但不能用于常量映射。const重载在C++;? 在C++中,函数的签名部分取决于它是否是const。这意味着一个类可以有两个具有相同签名的成员函数,但一个是const,另一个不是。如果您有这样一个类,那么编译器将根据您调用它的对象来决定调用哪个函数:如果它是类的const实例,则将调用该函数的const版本;如果对象不是常量,则将调用另一个版本,c++,function,constants,overloading,C++,Function,Constants,Overloading,在什么情况下您可能希望利用此功能?它就在那里,这样您就可以让编译器强制执行您返回的是常量对象还是常规对象,并且仍然保持相同的方法签名。有一个深入的解释。您可能想用它来决定是否返回对对象的常量引用。STL容器使用常量重载的begin()和end()函数来决定是返回常量迭代器还是普通迭代器。只有当成员函数返回指向类的数据成员(或成员的成员,或成员的成员等)的指针或引用时,这才有意义。通常不赞成返回非常量指针或对数据成员的引用,但有时这是合理的,或者只是非常方便(例如,[]运算符)。在这种情况下,您将
\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
限定符。