C++对象数组的问题,二段式初始始化【C++】(y)

对象数组

引例

#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;
}

但是平时我们在使用的时候就是用构造器默认参数或者构造器重载把系统默认的无参构造器进行包含。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章