设置类向量的元素等于类时的行为

时间:2016-06-11 15:11:35

标签: c++ pointers vector variable-assignment

如果我有课:

Class aClass
{
    vector<aClass> connections;
}

如果我要做的话,其他一切都被正确宣布:

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

b.connections.push_back(a);

这会创建对a的引用,还是会复制该类。

我希望它是一个指向该类的指针,但我不确定是否需要额外的语法来确保这一点。我记得读过,当一个类声明为aClass a = new aClass时,它正在创建一个指向堆中对象的指针,但我不确定这里会发生什么。

作为参考,这适用于链接列表。

如果有人能想到这个问题的更好的标题,请继续编辑。

4 个答案:

答案 0 :(得分:2)

  1. connections应为vector<aClass*>aClass a应为aClass* a

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

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

答案 1 :(得分:0)

首先,vector<aClass>不是类的向量,它是类的实例向量。

其次,在C ++中编译很难aClass a = new aClass();。在大多数情况下,类的默认构造实例仅创建为aClass a;,而new aClass()通常会将指针返回给类的新实例。

第三,即使您push_back向量的实例,它也会被复制。

对于默认构造的对象,可以通过resize向量{1}在向量的末尾构造一个新对象。

自2011年起,您可以使用emplace_back直接在向量内部通过非默认构造函数(使用非空构造参数集)构造实例。

答案 2 :(得分:0)

如果代码是可编译的,那么我认为你的意图是:

documentation表示有2次重载

void push_back( const T& value );
void push_back( T&& value );

因此,只要您不明确std::move或从函数中输入强制转换或push_back返回值,就会触发第一个重载,这意味着复制push_back将会叫做。否则第二个,移动将被调用。

编辑:类型广告和std::move是同样的事情。但是,它保留了const的正确性,因此如果你要传递const T,那么std :: move将使它成为const T&&,这在重载决策中非常危险。

你永远不应该通过const T&&,为什么阅读here

答案 3 :(得分:0)

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;

它将打印与以前相同的地址。