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