C++如何处理同名对象的向量?
How does C++ cope with vector of objects with the same name?
>假设我在某个局部作用域中创建了一个对象,并将其添加到作用域之外存在的向量中。
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"。
名称不一样。
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 从多个源构造一个对象,包括一个对象向量
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 对象 C++ 向量的 STL 容器
- 初始化C++中的对象向量
- 从自定义类获取对象向量中的 max 元素
- 如何在 c++ 中打印存档中的对象向量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 尝试重载输出运算符时,我无法遍历对象向量
- 如何在C++中打印对象向量的内容
- 打印出对象向量中的每个元素C++
- 在 c++ 的构造函数中分配对象向量时出错
- 遍历对象向量,并找到与从文本文件中提取的对象匹配的变量
- 对象向量是否在堆或堆栈上分配C++?
- 基于不同字段的对象向量的排序功能
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 用rapidjson读取子对象向量
- 尝试使用比较运算符对对象向量进行排序
- 如何用对象向量重载 cin(>>)
- 如何将某个元素从shared_ptr擦除到对象向量?