我已经阅读过const的用例,我觉得我对const有很好的理解。但是,我似乎无法弄清楚为什么我不经常看到这个:
void someFunction(const string& A) const
const成员函数中有const参数的位置。出于某种原因,每当我查看示例并且函数是const时,const似乎被剥离了这样的参数:
void someFunction(string& A) const
然而,这似乎并没有阻止我修改A.在const成员函数中使用const参数被认为是不好的形式吗?
如果A不会被修改,那么不将const保持在参数中的原因是什么?
编辑:这是我的错,因为我没有澄清,但我理解在参数之前添加它并在函数之后添加它之间的区别。我看到的很多代码从未组合过这两个代码,我只想弄清楚是否有原因。
答案 0 :(得分:4)
void someFunction(const string& A) const
最后一个const
表示该方法不会更改其中*this
引用的对象的状态。第一个const
表示函数不会改变参数的状态 - 它与第二个const
没有任何关联,所以你可能有这个:
void someFunction(string& A) const
在这种情况下,函数可能会更改A
参数的状态,但它可能不会更改其对象的状态。
例如(这是一个非常假设的例子):
class MyIntArray
{
// some magic here in order to implement this array
public:
void copy_to_vector(std::vector<int> &v) const
{
// copy data from this object into the vector.
// this will modify the vector, but not the
// current object.
}
}
这是结合这两者的例子:
class MyOutput
{
char prefix;
// This class contains some char which
// will be used as prefix to all vectors passed to it
public:
MyOutput(char c):prefix(c){}
void output_to_cout(const std::vector<int> &i) const
{
// iterate trough vector (using const_iterator) and output each element
// prefixed with c - this will not change nor the vector
// nor the object.
}
}
答案 1 :(得分:2)
const
仅适用于成员函数。它声明不会修改类对象。这并不意味着不能修改通过引用传递的函数参数。
将参数传递给函数const &
会阻止您修改参数。
class A
{
private:
int data;
public:
void func1(const std::string& s) const; // s cannot be modified, members of A cannot
void func2(std::string& s) const; // s can be modified, members of A cannot
void func3(const std::string& s); // s cannot be modified, members of A can be
void func4(std::string& s); // s can be modified, as can members of A
};
标记为const
的功能无法更改data
,但s
上没有此类限制,除非标记为const
。