1. default 关键字
class Foo
{
public:
Foo() = default;
Foo(int a): m_value(a){}
int m_value;
};
int main()
{
Foo f;
return 0;
}
在main
函数中,我们通过类的默认构造函数来实例化一个Foo
类型的对象f
,若没有Foo() = default;
关键字,因为,如果我们自己创建了构造函数,编译器就不会提供默认的构造函数,所以当我们创建了Foo(int a): m_value(a){}
构造函数,编译器是不会给我们在构造一个默认的 构造函数了。简单来说,若程序是如下的,编译器会报错,因为找不到核实的构造函数来初始化f
class Foo
{
public:
Foo(int a): m_value(a){}
int m_value;
};
int main()
{
Foo f; //error ,找不到核实的构造函数。
return 0;
}
2. explict 关键字
explict
关键字可以 抑制构造函数定义的隐式转换,举个例子
class A
{
public:
int m_value;
};
class Foo
{
public:
Foo() = default;
Foo(int a)
: m_value(a)
{}
void PrintFoo(Foo f)
{
cout << f.m_value;
}
int m_value;
};
int main()
{
Foo f;
f.PrintFoo(15);
return 0;
}
当构造函数Foo(int a): m_value(a){}
没有被explicit
关键字修饰时,f.PrintFoo(15);
可以成功运行。
若是Foo(int a): m_value(a){}
被explicit
关键字修饰,f.PrintFoo(15);
就会编译报错。
Tips: explicit关键字支队一个实参的构造函数有效。
Tips: explicit只能在类内声明时使用。