[英]Initialize vectors and std
如果我有一個var
vector<myClass> myVector;
它是否已經初始化?,即,我可以添加(push_back)inmediately元素,或者我應該以下面的方式調用構造函數?
myVector = vector<myClass>();
另一方面,它是相同的std::vector<myClass>
和vector<myClass>
嗎?
它已經初始化了嗎?
是的(假設這是std::vector
)。 與任何理智類一樣,它的所有構造函數(包括此處使用的默認構造函數)都將其置於一個定義良好的狀態。 此時,它是一個有效的空矢量。
我應該以下面的方式調用構造函數?
那不是調用構造函數(至少不是myVector
)。 在對象初始化期間自動調用構造函數; 沒有辦法第二次打電話給它。 這將創建另一個空向量,然后將其復制分配給myVector
。
另一方面,它是相同的std :: vector和vector嗎?
據推測,這是std::vector
, using namespace std;
轉儲到全局命名using namespace std;
。 為了避免懷疑,混淆和潛在的曖昧,你應該避免這樣做,刪除任何流氓使用指令,並始終將其稱為std::vector
。
在這種情況下
vector<myClass> myVector;
沒有必要單獨調用默認構造函數。
您可以調用push_back
和其他方法。
符號
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
或類似內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.