Ключевое слово = default
Ключевое слово = default указывает компилятору,
что для специальной функции-члена класса нужно
сгенерировать стандартную реализацию. Чаще всего
его применяют к конструктору по умолчанию,
конструктору копирования, конструктору перемещения,
оператору присваивания копированием, оператору
присваивания перемещением и деструктору. Параметров
у самого ключевого слова нет: оно ставится после
списка параметров функции вместо тела.
Явное указание = default бывает полезно, когда
компилятор перестает автоматически создавать нужную
функцию. Например, если в классе объявлен любой
конструктор, конструктор по умолчанию уже не
генерируется автоматически. Тогда его можно вернуть
с помощью = default.
Синтаксис
class ClassName
{
public:
ClassName() = default;
ClassName(const ClassName&) = default;
ClassName(ClassName&&) = default;
ClassName& operator=(const ClassName&) = default;
ClassName& operator=(ClassName&&) = default;
~ClassName() = default;
};
Пример
Давайте создадим класс Point с обычным
конструктором и вернем конструктор по умолчанию
через = default:
#include <iostream>
using namespace std;
class Point
{
public:
int x;
int y;
Point(int x, int y) : x(x), y(y) {}
Point() = default;
};
int main()
{
Point p1;
Point p2(1, 2);
cout << p1.x << " " << p1.y << endl;
cout << p2.x << " " << p2.y << endl;
return 0;
}
Результат выполнения кода:
0 0
1 2
Пример
Давайте вернем стандартный конструктор копирования
и стандартный оператор присваивания копированием
для класса MyClass:
#include <iostream>
using namespace std;
class MyClass
{
public:
int value;
MyClass(int value) : value(value) {}
MyClass(const MyClass&) = default;
MyClass& operator=(const MyClass&) = default;
};
int main()
{
MyClass a(1);
MyClass b = a;
MyClass c(2);
c = a;
cout << b.value << endl;
cout << c.value << endl;
return 0;
}
Результат выполнения кода:
1
1