簡體   English   中英

初始化向量和標准

[英]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::vectorusing 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM