将const向量<pointers>传递给方法但更改值指向</pointers>

时间:2010-01-16 02:11:59

标签: c++

我有以下代码(为了简洁起见,只显示相关部分 - 如果我太简短,请告诉我):

class my_class
{
    public:
    my_class() {m_i=0;}
    set(int i) {m_i = i;}
    private:
    int m_i;
}

void CallMod()
{
    // create a bunch of my_class* o = new my_class() and store in vector<my_class*> 
    // vObject (left out for brevity)
    Mod(vObject);
    // will vObject contain pointers to objects that have m_i == 2
}

void Mod(vector<my_class*> const & vObject)
{
    BOOST_FOREACH(my_class o, vObject)
    {
        o->set(2);
    }
}

这是否意味着当vObject是const时,一旦Mod返回,调用o-&gt; set(2)所做的修改将被保留?这是否表明“const”限定符不允许对vObject(即向量)进行修改操作,但是允许修改包含指向my_class的指针?

我明白了吗?任何回答这个问题的重复问题 - 我找不到一个 - 链接最受欢迎。

4 个答案:

答案 0 :(得分:3)

您的评估是正确的。您不能修改vObject的成员或在其上调用非const成员函数,但您可以修改成员并为向量中的任何指针调用my_class的非const成员函数。

答案 1 :(得分:3)

向量将是const。你只能从中获得const_iterators。你不能修改它或它的元素。

容器中的元素将是const指针。不幸的是,const指针并不意味着它指向的元素是const,只是指针的值不能改变。

如果你有一个vector<my_class>而不是vector<my_class*>,你将无法修改const向量中的my_class对象(显然,如果你输出了const-ness)。

答案 2 :(得分:1)

这意味着您无法在Mod()函数中修改(插入/删除)向量vObject。 这也意味着你不能在Mod()函数中修改指向my_class的指针。但是你可以修改这些指针所指向的内容。修改const指针和元素的规则也指向const指针。

答案 3 :(得分:0)

首先,考虑const和指针来理解为什么这是行为。以下是基本指针的不同可能性。 (假设您有两个动态分配的char数组:char* hellochar* goodbye已初始化为等效命名的字符串。)

没有什么是const:

char* ptr = hello;
ptr[0] = 'j';  // Legal
ptr = goodbye; // Legal

指向const的指针:

const char* ptr = hello;
ptr[0] = 'j';  // ILLEGAL - individual characters are const
ptr = goodbye; // Legal

Const指针:

char* const ptr = hello;
ptr[0] = 'j';  // Legal
ptr = goodbye; // ILLEGAL - ptr itself is const

指向const的指针:

const char* const ptr = hello;
ptr[0] = 'j';  // ILLEGAL - individual characters are const
ptr = goodbye; // ILLEGAL - ptr itself is const

取消引用const_iterator会返回对其存储对象的const引用。由于迭代器指向的对象是my_class*,因此结果是一个const指针(即my_class* const)。如上所示,您不能重新分配const指针,但可以在它指向的对象上调用非const方法。如果它是vector<const my_class*>,那么即使使用非const迭代器,也无法修改基础对象。