![](/img/trans.png)
[英]in c++ why we declare reference parameter as const in overloaded function?
[英]Is there a way to declare that input parameter of the function must be const reference?
這樣做的動機是(很少)我需要知道類構造函數或函數的輸入參數通常是const。 通常,當該類是一個使某些過程“自動化”的助手時。
例:
這是從容器中獲取隨機元素的確定范圍的方法嗎?
如果您看一下代碼,很明顯,如果傳遞給構造函數的容器被更改,則類功能將被破壞。 因此,有一種方法可以使用函數“ demand” const而不是“ promise” const。
例:
int f(const vector<int>& v)
{
return v.size();
}
int main()
{
vector<int> v;
v.push_back(42); // can f be changed to reject v because it is not const
cout << f(v);
}
聲明但不實現非const版本。
int f(vector<int>& v);
嘗試通過非常量向量的嘗試將被解析為該函數,然后您將收到鏈接器錯誤,因為不存在此類函數。
一些精美的模板游戲可能能夠將其轉換為編譯時錯誤。
沒有辦法保證這一點。 如果要確保對象不變,則該對象應歸類所有。 一種實現方法是將要保持常數的對象復制到類中,或者使用C ++ 11讓構造函數獲取右值引用並移動對象。
如果希望類中的某些屬性不受任何外部更改的影響,則應將它們由構造const TypeName _attr;
復制到屬性const TypeName _attr;
。
我不認為有可能。
如果有可能,您仍然可以那樣做
Object mutable_;
const Object & notMutavle = mutable_;
func(notMutable);
mutable.change();
無論如何,即使const
對象的狀態也可以更改,如果它具有一些mutable
字段。
如果要確保沒有人更改對象,則應該自己進行管理。
您可以通過重載非常量引用的函數來實現。
下一個示例對此進行了演示。 但是,代替返回-1,f的第一個版本應該引發異常。
#include <vector>
#include <iostream>
int f(std::vector<int>& )
{
return -1;
}
int f(const std::vector<int>& v)
{
return v.size();
}
int main()
{
std::vector<int> v;
v.push_back(42); // can f be changed to reject v because it is not const
std::cout << f(v)<<std::endl;
const std::vector<int> cv(5);
std::cout << f(cv)<<std::endl;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.