2015-11-28 73 views
3

在.cpp:C++在構造函數初始化數組

Person::Person(int _id[9], string name, int age) :_age(age), _name(name){}; 

的.H:

private: 
int _id[9]; 
string _name; 
int _age; 

如何intilaze在我隨着年齡的增長也做了同樣的方法提交的 'ID' 和名稱?

+0

相關/重複的:[?我如何通過一個數組來構造](http://stackoverflow.com/questions/9426932/how-do-i-pass-an -array-to-a-constructor) – NathanOliver

+2

使用'std :: vector '或者'std :: array ' – Casey

回答

1
class Person 
{ 
    typedef std::array<int, 9> ids_t; 
    Person(ids_t, string name, int age); 

private: 
    ids_t _id; 
    string _name; 
    int _age; 
}; 

Person::Person(ids_t id, string name, int age) : _id(id), _age(age), _name(name){} 
+0

能否請你解釋一下你在typedef文件中做了什麼? – XEvans

+1

@XEvans他創建了一個類型別名:現在'ids_t'是一個與'std :: array '類型相同的類型名稱。 – emlai

1

既然你不能指定C風格的數組,甚至初始化一個與另外,您可以通過使用C++使任務更簡單 - 風格陣列(可分配並複製初始化):

array<int, 9> _id; 

Person::Person(array<int, 9> id, string name, int age) 
: _id(id), _age(age), _name(name) { } 

或者,如果你堅持使用C數組,可以將參數數組成員數組與std::copy複製:

Person::Person(int id[9], string name, int age) : _age(age), _name(name) 
{ 
    copy(id, id + 9, _id); 
}; 

但請注意,傳遞C樣式數組是不好的,因爲編譯器將所有C樣式數組參數視爲指向數組第一個元素的指針。因此,id參數的類型實際上是int*,因此Person構造的呼叫者可以通過(使用隱式array-to-pointer decay)的陣列任何尺寸,一個指針到只是一個單個int,或甚至一個nullptr,如展示了here。試圖從這些無效參數中複製9個元素將導致未定義的行爲。

2

陣列不具有拷貝構造,而且參數_id在此構造

Person::Person(int _id[9], string name, int age) :_age(age), _name(name){}; 

隱式轉換爲指針傳遞作爲參數的陣列的第一個元素。這實際上是構造看起來像

Person::Person(int *_id, string name, int age) :_age(age), _name(name){}; 

和指針不留信息是否指向一個對象或數組的第一個對象。

所以你應該在這個參數後面附加一個參數來指定下層數組的大小,如果這樣的參數是paased的話。

例如

Person::Person(int *_id, size_t id_num, string name, int age) 
    :_id {}, _age(age), _name(name) 
{ 
    size_t size = id_num < 9 ? id_num : 9; 
    std::copy(_id, _id + size, this->_id); 
}