将 class 向量的元素设置为等于 class 时的行为
Behavior when you set an element of a vector of classes equal to a class
如果我有 class:
Class aClass
{
vector<aClass> connections;
}
在正确声明所有其他内容的情况下,如果我要这样做:
aClass a = new aClass();
aClass b = new aClass();
b.connections.push_back(a);
这会创建对 a
的引用还是会复制 class.
我希望它是指向 class 的指针,但我不确定是否需要额外的语法来确保这一点。我记得读过,当 class 被声明为 aClass a = new aClass
时,它正在创建一个指向堆中 object 的指针,但我不确定这里会发生什么。
作为参考,这是一个链表之类的东西。
此外,如果有人能为这个问题想出更好的标题,请继续编辑它。
首先,vector<aClass>
不是 classes 的向量,它是 class.
实例的向量
其次,aClass a = new aClass();
很难用C++编译。在大多数情况下,class 的默认构造实例被简单地创建为 aClass a;
,而 new aClass()
通常 returns 指向一个指针 class.
的新实例
第三,即使你push_back
一个实例到vector,它也会被复制。
对于默认构造的对象,您可以通过 resize
将向量乘以 1 来在向量的末尾构造一个新对象。
自 2011 年以来,您可以使用 emplace_back
.
直接在 vector 中通过非默认构造函数(具有非空的构造参数集)构造实例
如果代码是可编译的,我想这就是你的意图:
documentation 表示有 2 个重载
void push_back( const T& value );
void push_back( T&& value );
因此,只要您不显式 std::move
或类型强制转换或 push_back
return 函数中的值,就会触发第一个重载,这意味着复制 push_back
将被调用。否则将调用第二个移动。
编辑: 类型转换和 std::move
本质上是一样的。但是,它保留了 const 的正确性,因此如果您要传递 const T
,那么 std::move 将使它成为 const T&&
,这在重载决议中非常危险。
你不应该通过 const T&&
,关于为什么阅读 here。
connections
应该是vector<aClass*>
,aClass a
应该是aClass* a
。
然后,对于b.connections.push_back(a);
,将复制指针的值,而不是指针对象(即被指向的对象)。
我建议你使用 smart pointers 而不是原始指针,如果你确实想使用指针,比如 std::vector<std::shared_ptr<aClass>>
.
aClass a = new aClass();
aClass b = new aClass();
b.connections.push_back(a);
它甚至不会编译。正如有人提到的,您应该写 aClass *a
和 aClass *b
。
aClass a;
aClass b;
b.connections.push_back(a);
这会将值复制到向量中,因为您的向量包含 aClass 对象(值,而不是地址)。它不复制任何地址。然而,如果你做了这样的事情:
vector<aClass*> connections;
aClass *a = new aClass();
aClass *b = new aClass();
b.connections.push_back(a);
然后一个向量将保存一个指向 aClass 对象(aClass 的实例)的指针。所以在这种情况下 connections[0] 将指向 a
对象。如果你这样做::
cout << connections[0]<< endl;
cout << a << endl;
那么这些线是相等的。他们将打印相同的东西(相同的地址)。
最后,如果您删除 a
对象:
delete a;
然后它会指向内存中放置对象的那个地方,但是没有a
对象了。所以你不能这样做:
cout << a << endl;
但你仍然可以做到:
cout << connections[0] << endl;
并且它会打印出与之前相同的地址。
如果我有 class:
Class aClass
{
vector<aClass> connections;
}
在正确声明所有其他内容的情况下,如果我要这样做:
aClass a = new aClass();
aClass b = new aClass();
b.connections.push_back(a);
这会创建对 a
的引用还是会复制 class.
我希望它是指向 class 的指针,但我不确定是否需要额外的语法来确保这一点。我记得读过,当 class 被声明为 aClass a = new aClass
时,它正在创建一个指向堆中 object 的指针,但我不确定这里会发生什么。
作为参考,这是一个链表之类的东西。
此外,如果有人能为这个问题想出更好的标题,请继续编辑它。
首先,vector<aClass>
不是 classes 的向量,它是 class.
其次,aClass a = new aClass();
很难用C++编译。在大多数情况下,class 的默认构造实例被简单地创建为 aClass a;
,而 new aClass()
通常 returns 指向一个指针 class.
第三,即使你push_back
一个实例到vector,它也会被复制。
对于默认构造的对象,您可以通过 resize
将向量乘以 1 来在向量的末尾构造一个新对象。
自 2011 年以来,您可以使用 emplace_back
.
如果代码是可编译的,我想这就是你的意图:
documentation 表示有 2 个重载
void push_back( const T& value );
void push_back( T&& value );
因此,只要您不显式 std::move
或类型强制转换或 push_back
return 函数中的值,就会触发第一个重载,这意味着复制 push_back
将被调用。否则将调用第二个移动。
编辑: 类型转换和 std::move
本质上是一样的。但是,它保留了 const 的正确性,因此如果您要传递 const T
,那么 std::move 将使它成为 const T&&
,这在重载决议中非常危险。
你不应该通过 const T&&
,关于为什么阅读 here。
connections
应该是vector<aClass*>
,aClass a
应该是aClass* a
。然后,对于
b.connections.push_back(a);
,将复制指针的值,而不是指针对象(即被指向的对象)。我建议你使用 smart pointers 而不是原始指针,如果你确实想使用指针,比如
std::vector<std::shared_ptr<aClass>>
.
aClass a = new aClass();
aClass b = new aClass();
b.connections.push_back(a);
它甚至不会编译。正如有人提到的,您应该写 aClass *a
和 aClass *b
。
aClass a;
aClass b;
b.connections.push_back(a);
这会将值复制到向量中,因为您的向量包含 aClass 对象(值,而不是地址)。它不复制任何地址。然而,如果你做了这样的事情:
vector<aClass*> connections;
aClass *a = new aClass();
aClass *b = new aClass();
b.connections.push_back(a);
然后一个向量将保存一个指向 aClass 对象(aClass 的实例)的指针。所以在这种情况下 connections[0] 将指向 a
对象。如果你这样做::
cout << connections[0]<< endl;
cout << a << endl;
那么这些线是相等的。他们将打印相同的东西(相同的地址)。
最后,如果您删除 a
对象:
delete a;
然后它会指向内存中放置对象的那个地方,但是没有a
对象了。所以你不能这样做:
cout << a << endl;
但你仍然可以做到:
cout << connections[0] << endl;
并且它会打印出与之前相同的地址。