(1)定义:不带参数的构造函数就是默认构造函数
例如:
class A
{
public:
A();
};
A::A()
{
}
A a;
如果我们没有写默认构造函数,那么系统会为我们自动生成一个叫“合成默认构造函数”,例如:
class A
{
public:
int a;
};
A a;
当然,系统为我们生成默认构造函数也仅仅局限于默认构造函数,如果我们生成的对象带有参数,那么就需要我们定义相关的构造函数了,因为编译器不会生成带参数的构造函数,例如:
class A
{
public:
int a;
};
A a(3);
(2)有些情况下,我们不写默认构造函数是可以的,因为编译器为我们生成了合成的默认构造函数,单有些情况下需要我们自己定义默认构造函数,系统为我们合成的默认构造函数已经不能满足我们的要求了。例如:
class A
{
public:
int a;
A(int a){ }
};
class B
{
public:
int b;
public:
A a1;
};
B obj;
解决办法:
class A
{
public:
int a;
A(int a){ }
};
class B
{
public:
int a;
public:
B():a1(1)
{}
A a1;
};
B obj;
或者:
class A
{
public:
int a;
A(int a){ }
};
class B
{
public:
int a;
public:
A a1 = {1};
};
B obj;
=default :(c++11新特性)用于默认构造函数,一般的函数不能使用它。
class A
{
public:
int a;
A() = default;
A(int a) = default;
};
void fun() = default;
理解:可以把=default理解成{}。
=delete(c++11新特性,禁止使用某个函数,可以用在成员函数上)
class T
{
public:
int t;
T() = delete;
};
T obj;
同理:
class T
{
public:
int t;
T(int a, int b) = delete;
};
T obj{ 1,4 };
class T
{
public:
int t;
void func() = delete;
};
T obj;
obj.func();
总结:c++11之前,我们希望禁止调用某个函数就把属性写成private,有了=delete以后,要想禁用某个函数也可以使用=delete了。