C++ 中 const 重载有啥用?
Posted
技术标签:
【中文标题】C++ 中 const 重载有啥用?【英文标题】:What is the use of const overloading in C++?C++ 中 const 重载有什么用? 【发布时间】:2010-09-20 01:15:19 【问题描述】:在 C++ 中,函数的签名部分取决于它是否为 const。这意味着一个类可以有两个具有相同签名的成员函数,除了一个是 const 而另一个不是。如果你有一个这样的类,那么编译器将根据你调用它的对象来决定调用哪个函数:如果它是类的 const 实例,将调用函数的 const 版本;如果对象不是 const,则将调用另一个版本。
您希望在什么情况下使用此功能?
【问题讨论】:
【参考方案1】:这只有在成员函数返回一个指针或对类的数据成员(或成员的成员,或成员的成员,...等)的引用时才有意义。通常不赞成返回非常量指针或对数据成员的引用,但有时它是合理的,或者只是非常方便(例如 [] 运算符)。在这种情况下,您需要提供一个 const 和一个非常量版本的 getter。这样,是否可以修改对象的决定取决于使用它的函数,该函数可以选择将其声明为 const 或 non-const。
【讨论】:
【参考方案2】:它在那里,因此您可以让编译器强制您返回一个 const 对象还是一个常规对象,并且仍然保持相同的方法签名。 Const Correctness有深入的解释。
【讨论】:
【参考方案3】:看看 std::map::operator[] 的行为。如果您尝试引用无效键,则 const 版本会引发错误,但非 const 版本会执行插入操作。插入行为比必须使用 std::map::insert 更方便(而且会进行覆盖),但不能用于 const 映射。
【讨论】:
【参考方案4】:您可能希望使用它来决定是否返回对对象的 const 引用。 STL 的容器使用一个 const 重载的 begin() 和 end() 函数来决定是返回一个 const_iterator 还是一个普通的迭代器。
【讨论】:
【参考方案5】:#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*
。第三个参数将这两个函数分开。
【讨论】:
您根本没有解释为什么成员函数需要const
限定符。以上是关于C++ 中 const 重载有啥用?的主要内容,如果未能解决你的问题,请参考以下文章