在C ++中使用const重载有什么用?

时间:2008-10-30 18:04:24

标签: c++ function const overloading

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

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

5 个答案:

答案 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*。第三个参数将这两个功能分开。

相关问题