如果我有一个var
vector<myClass> myVector;
它已经初始化了吗?,也就是说,我可以添加(push_back)inmediately元素,或者我应该按照以下方式调用构造函数?
myVector = vector<myClass>();
另一方面,std::vector<myClass>
和vector<myClass>
是否相同?
答案 0 :(得分:5)
它已经初始化了吗?
是(假设这是std::vector
)。与任何理智类一样,它的所有构造函数(包括此处使用的默认构造函数)都将其置于一个定义良好的状态。此时,它是一个有效的空矢量。
我应该按照以下方式调用构造函数?
没有调用构造函数(至少不在myVector
上)。在对象初始化期间自动调用构造函数;没有办法第二次打电话。这会创建另一个空向量,然后将其复制分配给myVector
。
另一方面,它是否与std :: vector和vector相同?
据推测,这是std::vector
,使用邪恶的using namespace std;
转储到全局命名空间中。为了避免怀疑,混淆和潜在的暧昧,你应该避免这样做,删除任何流氓使用指令,并始终将其称为std::vector
。
答案 1 :(得分:2)
在这种情况下
vector<myClass> myVector;
无需单独调用默认构造函数。
您可以拨打push_back
和其他方法。
答案 2 :(得分:1)
符号
MyClassType a;
实际调用MyClassType
的默认构造函数(如果有)。所以是的,vector
已经初始化并可以使用了。
你的第二个片段:
myVector = vector<myClass>();
实际创建一个默认构建的新的临时vector
,然后调用myVector
的副本分配运算符operator=()
。
在这方面,C ++与许多其他语言不同。例如,在Java中,您需要执行MyClassType a = new MyClassType()
。这在C ++中不是必需的。每当使用自动存储 1 声明类类型的值时,该对象将自动默认构造。对于班级成员也是如此。让我们说你有:
class A {
std::vector<int> m_myVector;
};
然后无需初始化m_myVector
- 只要您实例化类A
的对象,它就会自动完成。
在堆上分配对象时会有所不同:
// Note: DON'T use raw pointers in actual code - use smart pointers instead.
// Just for illustration purposes.
// This is just a pointer to an A, it's not yet initialized.
A* myA;
myA = new A();
// now myA points to a heap allocated, default constructed A object.
// Note that you can omit the default constructor's `()` and just write:
myA = new A;
分配对象的堆实际上更接近Java所做的工作。无论如何,在编写适当的C ++时,您很少需要堆分配,而且您不会使用vector
进行分配。
1 自动存储:简单地说,您使用C ++创建的任何内容都不使用new/delete
或类似内容。