构造函数
程序员文章站
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 }
{
}
}
优势:
- 效率更高
- 某些情况下,只能使用这种方式初始化
- 使用成员初始化列表这样的方式构造类,要注意一个问题,即为成员赋值的顺序不是依据代码的顺序,而是成员变量在类的出现顺序
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);
下一篇: C#Linq查询操作使用举例
推荐阅读
-
mybatis-plus条件构造器 (QueryWrapper,LambdaQueryWrapper 比较)
-
javascript自定义in_array()函数实现方法_javascript技巧
-
C++ 模板常见特性(函数模板、类模板)
-
学习python的第十七天(二分法,有名函数,匿名函数,内置函数)
-
自己写了一个php检测文件编码的函数_PHP教程
-
PHP采用自定义函数实现遍历目录下所有文件的方法_PHP
-
自己写的php中文截取函数mb_strlen和mb_substr
-
php addslashes函数
-
python进阶教程之函数参数的多种传递方法
-
php 缩略图实现函数代码_php入门_脚本之家