const成员函数中的const参数

时间:2013-10-09 23:31:17

标签: c++ const

我已经阅读过const的用例,我觉得我对const有很好的理解。但是,我似乎无法弄清楚为什么我不经常看到这个:

void someFunction(const string& A) const

const成员函数中有const参数的位置。出于某种原因,每当我查看示例并且函数是const时,const似乎被剥离了这样的参数:

void someFunction(string& A) const

然而,这似乎并没有阻止我修改A.在const成员函数中使用const参数被认为是不好的形式吗?

如果A不会被修改,那么不将const保持在参数中的原因是什么?

编辑:这是我的错,因为我没有澄清,但我理解在参数之前添加它并在函数之后添加它之间的区别。我看到的很多代码从未组合过这两个代码,我只想弄清楚是否有原因。

2 个答案:

答案 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.
     }

}

哦,看看这个问题:Use of 'const' for function parameters

答案 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