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

问题描述 投票:58回答:5

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

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

c++ function const overloading
5个回答
31
投票

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


24
投票

它在那里,因此您可以使编译器强制执行是否返回const对象还是常规对象,并且仍保持相同的方法签名。 Const Correctness有深入的解释。


5
投票

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


5
投票

看看std :: map :: operator []的行为。如果您尝试引用无效的密钥,则const版本会引发错误,但非const版本会插入。插入行为比必须使用std :: map :: insert更为方便(而且还会进行覆盖),但不适用于const映射。


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

© www.soinside.com 2019 - 2024. All rights reserved.