2012-11-20 93 views
4

爲什麼STL容器定義訪問器的const和非const版本?爲什麼有const和非const訪問?

定義const T& at(unsigned int i) constT& at(unsigned int)而不僅僅是非const版本有什麼好處?

+0

的可能的複製[與常量和沒有的功能相同 - 什麼時候和爲什麼(https://stackoverflow.com/questions/27825443/same-function-with-const-and-without-when-and -爲什麼) –

回答

8

因爲無法在const矢量對象上調用at

如果你只有非const版本,以下內容:

const std::vector<int> x(10); 
x.at(0); 

不會編譯。使用const版本可以實現這一點,並且同時防止您實際更改at返回的內容 - 這是合同規定的,因爲矢量爲const

const版本可以在非const對象上調用,並允許您修改返回的元素,由於該向量不是常量,所以也是有效的。

const std::vector<int> x(10); 
     std::vector<int> y(10); 

int z = x.at(0);   //calls const version - is valid 
x.at(0) = 10;    //calls const version, returns const reference, invalid 

z = y.at(0);    //calls non-const version - is valid 
y.at(0) = 10;    //calls non-const version, returns non-const reference 
          //is valid 
相關問題