簡體   English   中英

C++中const重載有什么用?

[英]What is the use of const overloading in C++?

在 C++ 中,函數的簽名部分取決於它是否為 const。 這意味着一個類可以有兩個具有相同簽名的成員函數,除了一個是 const 而另一個不是。 如果你有一個這樣的類,那么編譯器將根據你調用它的對象來決定調用哪個函數:如果它是類的 const 實例,則將調用該函數的 const 版本; 如果對象不是常量,則將調用另一個版本。

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

這僅在成員函數返回對類的數據成員(或成員的成員,或成員的成員的成員,......等)的指針或引用時才有意義。 通常不贊成返回非常量指針或對數據成員的引用,但有時這是合理的,或者只是非常方便(例如 [] 運算符)。 在這種情況下,您需要提供一個 const 和一個非常量版本的 getter。 這樣,是否可以修改對象的決定取決於使用它的函數,它可以選擇將其聲明為常量或非常量。

它在那里,所以你可以讓編譯器強制你返回一個 const 對象還是一個常規對象,並且仍然保持相同的方法簽名。 Const Correctness 上有深入的解釋。

看看 std::map::operator[] 的行為。 如果您嘗試引用無效鍵,則 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* 第三個參數將這兩個功能分開。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM