簡體   English   中英

c ++ 03:std :: map中內置類型的默認構造函數

[英]c++03: default constructor for build-in types in std::map

我一直以為代碼如下

std::map<int, int> test;
std::cout << test[0] << std::endl;

會打印隨機值,因為它會在map中創建單位化值。 但是,事實證明,創建的int實際上總是初始化為零,並且標准內置類型在某些情況下也是零初始化的。

問題是:當對標准類型(int / char / float / double / size_t)執行零初始化時? 如果我宣布int i;我很確定 在不知名的地方,它將包含隨機數據。

PS問題是關於C ++ 03標准。 問題的原因是,現在我不再確定何時必須為內置類型(如int / float / size_t)提供初始化,或者可以安全地省略它。

標准容器( mapvector等)將始終對其元素進行初始化

粗略地說, 值初始化是:

  • 默認初始化,如果有默認構造函數
  • 否則初始化為零

(有人會說,兩全其美)

語法很簡單: T t = T(); 將值初始化t (和T t{};在C ++ 11中)。

當您使用map<K,V>::operator[] ,該對的“value”部分是值初始化的,對於內置類型,它會產生0

如果我宣布int i,我很確定 在不知名的地方,它將包含隨機數據。

不,不總是。

如果您創建POD類型的對象,那么它將被整合:

struct A
{
  int iv;
  float fv;
};

int main()
{
  A a; // here the iv and fv are uninitialized
}

一旦添加構造函數,它們就會被初始化:

struct A
{
  A(){} // iv and fv initialized to their default values
  int iv;
  float fv;
};

int main()
{
  A a; // here the iv and fv are initialized to their default values
}

特別是對於上述情況:

std::map<int, int> test;
std::cout << test[0] << std::endl;

我們正在使用std::map::operator[];

參考http://www.cplusplus.com/reference/stl/map/operator[]/

對於T&map :: operator [](const key_type&x);

... 如果x與容器中任何元素的鍵不匹配,該函數將使用該鍵插入一個新元素,並返回對其映射值的引用。 請注意,即使沒有為元素指定映射值(使用其默認構造函數構造元素),這也會將映射大小增加1

所以, test[0] leades to test[0] = int();

這里的實例: http//ideone.com/8yYSk

另請閱讀: std :: map內置類型的默認值

請注意,char,int,float等數據類型未初始化。 但在這種特殊情況下,它被初始化,因為它在stl容器類中使用。

初始化所有stl容器類對象。

最簡單的解決方案是簡單地創建一個始終初始化的模板包裝器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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