【【C++11特性篇】【强制/禁止 】生成默认函数的关键字default&delete(代码演示)
2023-12-23 06:24:28
前言
大家好吖,欢迎来到 YY 滴C++系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!
一.强制生成默认函数的关键字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;
}
文章来源:https://blog.csdn.net/YYDsis/article/details/135163361
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!