C ++如何处理具有相同名称的对象向量?

时间:2018-08-21 21:22:45

标签: c++ vector

假设我在某个本地范围内创建一个对象,并将其添加到该范围外的向量中。

std::vector<sometype> Vec;
for( int i = 0, etc... )
{
    sometype Object;
    Vec.push_back(Object);
}

现在,将Object的副本传递给Vec,并且Object本身将被销毁。

但是,如果继续这样做,我将继续创建存储在向量中的许多名称为“ Object”的对象。现在,我可以通过它们的索引访问它们,但是C ++如何处理我显然有许多同名对象的事实?

4 个答案:

答案 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”的命令。在这里,它通过引用(而不是值)传递,这意味着该函数“接收”的地址,而不是实际实例。

区别是:

  • 该函数的形式参数为“ const T&value”

(基于cppreference.com,其中函数声明为std :: vector :: push_back(常量T&值),正式名称为“值”。)

  • 起作用的实际参数是“ sometype&Object”。

(来自您的代码)

  • 很明显,这两个名称不相同。

因此,您的问题得出的结论是“从逻辑上讲不是从上一个论点或陈述得出的结论或陈述。”


摘要:

a)您的代码没有称为“值”或“ T”的内容。

b)并且,如果您检查std :: vector代码,则不会找到“ sometype”或“ Object”。

名称不同。