对于c++的一个空的类,例如
class Foo
{
}
实际上编译的时候编译器会给这个类加上默认的如下的几个函数:
1、默认构造函数
2、默认析构函数
3、默认拷贝函数
4、默认移动拷贝函数
5、默认赋值函数
6、默认移动赋值函数
即:
class Foo
{
public:
Foo(); // 默认构造函数
~Foo(); // 默认析构函数
Foo(const Foo& foo); // 默认拷贝函数
Foo(Foo&& foo); // 默认移动拷贝函数
Foo& operator = (const Foo& foo); // 默认赋值函数
Foo& operator = (Foo&& foo); // 默认移动赋值函数
};
一、=default的用法
当我们在类中定义了构造函数,若我们也要使用默认的构造函数,那么我们就在默认的构造函数后加上=default。例如:
class Foo
{
public:
Foo(int a, int b);
Foo() = default;
};
int main()
{
Foo foo; // 编译通过,如果没有Foo() = default这句话,将编译报错,系统找不到默认的构造函数,因为类中已经定义了构造函数,系统就不会使用默认的构造函数,要想使用默认的构造函数,可以在默认构造函数后加上=default实现
return 0;
}
=default只能用在系统默认的函数上,普通的类成员函数是不可加=default的,因为他不是系统默认的。
二、=delete的用法
class Foo
{
public:
Foo() = default;
~Foo() = default;
Foo(const Foo& foo) = delete;
Foo(Foo&& foo) = default;
Foo& operator = (const Foo& foo) = delete;
Foo& operator = (Foo&& foo) = default;
};
int main()
{
Foo foo();
Foo foo1(foo);// 编译报错,因为Foo(const Foo& foo) = delete;删除了
Foo foo2 = foo // 编译报错,因为Foo& operator = (const Foo& foo) = delete;
}
这里=delete就是禁止编译器使用默认的函数。
=delete也可以使用在普通成员函数上,经过=delete修饰的函数,不可以调用。例如:
class Foo
{
public:
void fun(int a) = delete;
}
int main()
{
Foo foo; // 调用默认构造函数
foo.fun(0.5); // 编译报错,因为fun已经delete了
}