欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

构造函数

程序员文章站 2022-03-15 22:40:42
...

构造函数

在类的定义中有一种特殊的成员函数叫做构造函数,构造函数在类被创建时自动被调用,一般用来创建新的类实例时执行初始化操作,构造函数与它所在的类同名,并且没有返回值,任何类都至少有一个构造函数

//示例:
class ROLE
{
private:
    int hpRevover;
    void init()
    {
        hpRevover=3;
    }
public:
    ROLE()
    {
        init();
    }
    int hp;
    int damage;
    void Act(ROLE& role)
    {
        role.hp-=damage;
    }
};

如果一个类没有显示的定义一个构造函数,编译器会自动添加一个默认的构造函数,这个默认构造函数是无参数,无返回值的函数


default 关键字

只要定义过构造函数,默认构造函数就不会被定义,有时候我们希望还可以被默认构造,就需要类有有一个默认构造函数

自己定义默认构造函数

Role(){};
//通过 default 来定义默认构造函数
Role()=default;

如果在默认构造函数中什么都不做,这俩种都是可以的,但是更推荐使用default关键字,因为效率更高。


explicit 关键字

被explicit 关键字修饰的构造函数会禁用类型转换


使用成员初始化列表

//语法:
class Role
{
private:    
    int hp;
    int mp;
public:
    Role(int _hp,int _mp):hp{ _hp } , mp{ _mp }
    {
        
    }
}

优势:

  1. 效率更高
  2. 某些情况下,只能使用这种方式初始化
  3. 使用成员初始化列表这样的方式构造类,要注意一个问题,即为成员赋值的顺序不是依据代码的顺序,而是成员变量在类的出现顺序
class ROLE
{
private:
    int hp;
    int hpRecover;
    int lv;
public:
    ROLE(int _lv,int _damage):lv{_lv},damage{_damage},hp{lv*100},hpRecover{lv}
    {
        
    }
    int damage;
    void Act(ROLE& role);
}
/*
实际初始化顺序
hp        = lv*100;
hpRecover = lv;
lv        = _lv;
damage    = _damage;

委托构造

委托构造函数初始化列表里不能初始化成员变量且只能调用一次同一个类的构造函数

语法示例:

class ROLE
{
private:
    int hp;
    int hpRecover;
    int lv;
public:
    ROLE():ROLE(100,200)
    {
        
    }
    ROLE(int _lv,int _damage):lv{_lv},damage{_damage}
    {
        
    }
    int damage;
    void Act(ROLE& role);
}

副本构造函数

编译器为类指定了一个默认的副本构造函数,我们也可以手动指定副本构造函数

class Role
{
    
}
Role role1;
Role role2(role1);