前言
大家好吖,欢迎来到 YY 滴C++系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!
- YY的《C++》专栏
- YY的《C++11》专栏
- YY的《Linux》专栏
- YY的《数据结构》专栏
- YY的《C语言基础》专栏
- YY的《初学者易错点》专栏
- YY的《小小知识点》专栏
目录
- 一.强制生成默认函数的关键字default
- 二.禁止生成默认函数的关键字delete
一.强制生成默认函数的关键字default
- 根据以上2,3点,我们知道:
- 没有实现 析构函数 、拷贝构造、拷贝赋值重载 中的任意一个,编译器才会生成默认的移动构造
- 如果我们已经自己生成了三个函数中的某一个,这时编译器不再生成默认的移动构造,但是我们依旧希望他生成,该怎么操作?
- 如下面代码场景所示:
Person(Person&& p) = default;
class Person
{
public:
Person(const char* name = "", int age = 0)
:_name(name)
, _age(age)
{}
Person(const Person& p) //我们手动写了拷贝构造
:_name(p._name)
, _age(p._age)
{}
Person(Person&& p) = default; //此时移动构造仍然会生成
private:
bit::string _name;
int _age;
};
int main()
{
Person s1;
Person s2 = s1;
Person s3 = std::move(s1);
return 0;
}
二.禁止生成默认函数的关键字delete
- 只需在该函数声明加上=delete即可,该语法指示编译器不生成对应函数的默认版本,称 =delete修饰的函数为 删除函数
- 如下面代码场景所示:`Person(Person&& p) = delete;
class Person
{
public:
Person(const char* name = "", int age = 0)
:_name(name)
, _age(age)
{}
//此时我们没有写析构函数 、拷贝构造、拷贝赋值重载 ,编译器理应默认生成移动构造
Person(Person&& p) = delete; //此时移动构造不会生成
private:
bit::string _name;
int _age;
};
int main()
{
Person s1;
Person s2 = s1;
Person s3 = std::move(s1);
return 0;
}