我有以下代码(为了简洁起见,只显示相关部分 - 如果我太简短,请告诉我):
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的指针?
我明白了吗?任何回答这个问题的重复问题 - 我找不到一个 - 链接最受欢迎。
答案 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* hello
和char* 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迭代器,也无法修改基础对象。