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