假设我在某个本地范围内创建一个对象,并将其添加到该范围外的向量中。
std::vector<sometype> Vec;
for( int i = 0, etc... )
{
sometype Object;
Vec.push_back(Object);
}
现在,将Object的副本传递给Vec,并且Object本身将被销毁。
但是,如果继续这样做,我将继续创建存储在向量中的许多名称为“ Object”的对象。现在,我可以通过它们的索引访问它们,但是C ++如何处理我显然有许多同名对象的事实?
答案 0 :(得分:3)
sometype
对象的名称无关紧要。您是正确的,每次调用Object
时,Vec
的副本将被放置到push_back
上,但这不是放置在矢量上的对象的名称。实际对象放置在向量中,可以通过正确索引向量来引用。
答案 1 :(得分:3)
该对象的名称不是Object
。那是变量的名称。用于复制构造vector元素的变量的名称与该元素没有任何关系。
对象通常没有名称。有些确实如此,尤其是那些由变量命名的对象。但是动态构造的对象却没有。即使对象的变量和名称之间的连接也很松散。例如,如果您只有一个对象的指针,则无法找出该对象是否由变量命名。
答案 2 :(得分:0)
只需考虑将变量名作为某些内存地址的替代表示形式(对您来说是透明的!)。您已经在内存中的某个特定位置创建了一个对象,该对象由您的变量名引用。现在,您将对象复制到一个新的位置,该地址具有一个不同的地址,该地址与原始对象所处的地址完全无关,因此它也将获得一个新的“名称”,而变量名仍引用旧地址(只要仍在范围内。)
当然,在向量内部,这个新的“名称”不仅是地址,而且是如何找到它的秘诀(vec[someIndex]
:“转到向量内部数据的开头,您将找到您的对象相对于给定的偏移量”,这是;荒唐地说,索引运算符的实际操作-再次对您透明)。
答案 3 :(得分:0)
C ++如何处理具有相同名称的对象向量。
非主流。
在您的for循环中,单词“ Object”出现2次。
a)第一个出现的“ sometype Object;”是对“自动”内存区域的声明和初始化。在这种情况下,“对象”一词在有限的范围和有效期内标识了实例的位置。
b)第二次出现“ Vec.push_back(Object);”是编译器生成代码以将实例传递到函数“ push_back”的命令。在这里,它通过引用(而不是值)传递,这意味着该函数“接收”的地址,而不是实际实例。
区别是:
(基于cppreference.com,其中函数声明为std :: vector :: push_back(常量T&值),正式名称为“值”。)
(来自您的代码)
因此,您的问题得出的结论是“从逻辑上讲不是从上一个论点或陈述得出的结论或陈述。”
摘要:
a)您的代码没有称为“值”或“ T”的内容。
b)并且,如果您检查std :: vector代码,则不会找到“ sometype”或“ Object”。
名称不同。