将 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

  1. connections应该是vector<aClass*>aClass a应该是aClass* a

  2. 然后,对于b.connections.push_back(a);,将复制指针的值,而不是指针对象(即被指向的对象)。

  3. 我建议你使用 smart pointers 而不是原始指针,如果你确实想使用指针,比如 std::vector<std::shared_ptr<aClass>>.

aClass a = new aClass();
aClass b = new aClass();

b.connections.push_back(a);

它甚至不会编译。正如有人提到的,您应该写 aClass *aaClass *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;

并且它会打印出与之前相同的地址。