C++如何处理同名对象的向量?

How does C++ cope with vector of objects with the same name?

本文关键字:对象 向量 何处理 处理 C++      更新时间:2023-10-16

>假设我在某个局部作用域中创建了一个对象,并将其添加到作用域之外存在的向量中。

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

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

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

sometype对象的名称无关紧要。您是正确的,每次调用push_back时,Object的副本都会放在Vec上,但不是放置在向量上的对象的名称。将实际对象放入向量中,可以通过正确索引到向量来引用该对象。

对象的名称不是Object。这是一个变量的名称。用于复制构造向量元素的变量的名称与该元素没有任何关系。

对象通常没有名称。有些确实如此,特别是那些由变量命名的对象。但动态构造的对象则不然。甚至对象的变量和名称之间的联系也很松散。例如,如果您只有指向某个对象的指针,则无法确定该对象是否由变量命名。

只需将变量名称视为某些内存地址的替代表示形式(对您透明!您已在内存中的某个特定位置创建了一个对象,该对象由变量名称引用。现在,您将对象复制到具有不同地址的新位置,该位置与原始对象所在的地址完全无关,因此它也获得了一个新的"名称",而变量名称仍然引用旧地址(只要仍在范围内(。

当然,在向量内部,这个新的"名称"不仅仅是一个地址,而是一个如何找到它的配方(vec[someIndex]:"转到向量内部数据的开头,你会在给定的偏移量处找到你的对象",也就是说;说得很滑稽,索引运算符实际上做了什么——对你来说又是透明的(。

C++如何处理同名对象的向量。

不合时宜。

在 for 循环中,单词"对象"出现了 2 次。

a(第一次出现,"sometype Object;",是"自动"内存区域的声明和初始化。 在此上下文中,"对象"一词标识实例在该有限范围和生存期内的位置。

b( 第二次出现,"Vec.push_back(对象(;",是编译器生成代码以将实例传递到函数 'push_back' 的命令。 在这里,它是通过引用(而不是值(传递的,这意味着函数"接收地址",而不是实际实例。

区别在于:

  • 该函数的形式参数是"const T&value"

(基于 cppreference.com,其中函数声明为 std::vector::p ush_back(const T& value(,正式名称为"value"。

  • 函数实际参数是"sometype&Object"。

(来自您的代码(

  • 显然,这两个名字是不一样的。

因此,您的问题得出了"逻辑上不是从先前的论点或陈述得出的结论或陈述"。


总结:

a( 你的代码没有所谓的"值"或"T"。

b( 如果你检查 std::vector 代码,你不会找到"sometype"或"Object"。

名称不一样。