對象數組
引例
#include <iostream>
using namespace std;
class Stu
{
public:
Stu(string n):_name(n){} //不帶默認形參的構造器
void dis()
{
cout<<_name<<endl;
}
private: string _name;
};
int main()
{
Stu s("zhangsan");
Stu sa[] = {Stu("lisi"),Stu("wangwu")};
Stu *p = new Stu[2]{Stu("abc"),Stu("def")};
return 0;
}
如果對象數組中有100個對象就會發生100構造。
例如上面引例我們可以對於數組進行部分初始化。
但是我們前面說過一定要把默認無參的進行包含,否則像
Stu s;
Stu sa[];
Stu *p = new Stu;
Stu *p = new Stu[2];
上面定義就無法通過。
就只能使用:
Stu s("zhangsan");
Stu sa[] = {Stu("lisi"),Stu("wangwu")};
Stu* p = new Stu("zhaosi");
Stu *p = new Stu[2]{Stu(“abc”),Stu(“def”)};
來定義。
那麼上面一旦數據量變大就會特別麻煩,並且我們大都數情況下創建對象的時候都是不帶參數的,所以我們就要把構造器修改爲帶默認形參的構造器。
我們對於上面代碼進行修改:
#include <iostream>
using namespace std;
class Stu
{
public:
Stu(string n = ""):_name(n){} //帶默認形參的構造器
void dis()
{
cout<<_name<<endl;
}
private: string _name;
};
int main()
{
Stu s;
Stu sa[100] = {Stu("lisi"),Stu("wangwu")};
Stu* p = new Stu;
return 0;
}
在使用默認形參之後:
Stu s;
Stu sa[100] = {Stu("lisi"),Stu("wangwu")};
Stu* p = new Stu;
Stu* ps = new Stu[100];
編譯就不會有問題
上面代碼涉及棧對象數組和堆對象數組,對於兩類對象數組如果生成的數組,未初始化,則必調用無參構造器。或手動調用帶參構造器。所以構造器無論是重載還是默認參數,一定要把系統默認的無參構造器包含進來。不然生成數組的時候,會比較麻煩。
但是出現的一個問題:
默認的參數最終使用的適合還是需要修改的,那麼如何解決?
二段式初始始化
在對象數組中,要求對象必須包含默認無參構造器的情況,但有時,默認無參構造器並不能完全滿足我們的需求,可能要再次初始化。
二段初始化,常將默認無參構造器置爲空。然後再次調用初始化函數,比如 cocos 中對象生成就是這樣的。
二段初始化過程:
先讓構造器爲空
構造器初始化讓init()來完成
代碼如下:
#include <iostream>
using namespace std;
class Stu
{
public:
Stu(){}
Stu(string n):_name(n){} //形參構造器
void init(string name)
{
_name = name;
}
void dis()
{
cout<<_name<<endl;
}
private: string _name;
};
int main()
{
Stu* ps = new Stu[100];
for (int i = 0; i < 100; i++)
{
ps[i].init(""); //""中間存放你需要存放的數據
}
return 0;
}
但是平時我們在使用的時候就是用構造器默認參數或者構造器重載把系統默認的無參構造器進行包含。