【C++】C++11--- 类的新功能

目录

类的新功能

默认成员函数

示例

类成员变量初始化

强制生成默认函数的关键字default

禁止生成默认函数的关键字delete


类的新功能

默认成员函数

  • 构造函数
  • 析构函数
  • 拷贝构造函数
  • 拷贝赋值重载
  • 取地址重载
  • const取地址重载

C++11在原先的6个默认成员函数的基础上,新增了2个:【移动构造函数】和【移动赋值运算符重载


默认移动构造的生成条件

条件1:开发者不显示实现移动构造函数;

条件2:析构函数、拷贝构造、赋值运算符重载函数任意一个都没有显示实现;

当同时满足条件1与条件2,编译器自动生成移动构造函数;

移动构造函数的规则

  • 移动构造函数对于内置类型成员按字节序完成值拷贝;
  • 移动构造函数对于自定义类型成员调用自定义类型的移动构造,若自定义类型成员没有移动构造,便调用其拷贝构造;

默认移动赋值的生成条件

条件1:开发者不显示实现移动赋值函数;

条件2:析构函数、拷贝构造、赋值运算符重载函数任意一个都没有显示实现;

当同时满足条件1与条件2,编译器自动生成移动赋值函数;

移动赋值函数的规则

  • 移动赋值函数对于内置类型成员直接赋值;
  • 移动赋值函数对于自定义类型成员调用自定义类型的移动赋值,若自定义类型成员没有移动赋值,便调用其赋值运算符重载函数;

开发者显示提供移动构造与移动赋值,编译器不再自动生成移动构造与移动赋值;

示例

namespace RightReference
{class string{public:typedef char* iterator;iterator begin(){return _str;}iterator end(){return _str + _size;}string(const char* str = ""):_size(strlen(str)), _capacity(_size){//cout << "string(char* str)" << endl;_str = new char[_capacity + 1];strcpy(_str, str);}void swap(string& s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);}// 拷贝构造string(const string& s):_str(nullptr){cout << "string(const string& s) --- 深拷贝" << endl;_str = new char[s._capacity + 1];strcpy(_str, s._str);_size = s._size;_capacity = s._capacity;}//移动构造--右值string(string&& s){cout << "string(string&& s) -- 移动拷贝" << endl;swap(s);}// 拷贝赋值string& operator=(const string& s){cout << "string& operator=(const string& s) --- 深拷贝" << endl;string tmp(s);swap(tmp);return *this;}// 移动赋值--右值string& operator=(string&& s){cout << "string& operator=(string&& s) -- 移动拷贝" << endl;swap(s);return *this;}~string(){delete[] _str;_str = nullptr;}char& operator[](size_t pos){assert(pos < _size);return _str[pos];}void reserve(size_t n){if (n > _capacity){char* tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}}void push_back(char ch){if (_size >= _capacity){size_t newcapacity = _capacity == 0 ? 4 : _capacity * 2;reserve(newcapacity);}_str[_size] = ch;++_size;_str[_size] = '\0';}string& operator+=(char ch){push_back(ch);return *this;}const char* c_str() const{return _str;}private:char* _str = nullptr;size_t _size = 0;size_t _capacity = 0;};
}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& operator=(const Person& p){if(this != &p){_name = p._name;_age = p._age;}return *this;}*//*~Person(){}*/private:RightReference::string _name;int _age;
};int main()
{Person s1;Person s2 = s1;Person s3 = std::move(s1);Person s4;s4 = std::move(s2);return 0;
}

类成员变量初始化

默认生成的构造函数,对于自定义类型的成员会调用其构造函数进行初始化,但并不会对内置类型的成员进行处理;于是C++11支持非静态成员变量在声明时进行初始化赋值,默认生成的构造函数会使用这些缺省值对成员进行初始化;比如:

class Person
{
public://...
private://非静态成员变量,可以在成员声明时给缺省值RightReference::string _name = "peter";int _age = 20;static int _n; //静态成员变量不能给缺省值
};

强制生成默认函数的关键字default

C++11可以更好的控制要使用的默认成员函数,假设在某些情况下需要使用某个默认成员函数,但是因为某些原因导致无法生成这个默认成员函数,这时可以使用default关键字强制生成某个默认成员函数;

例如:我们提供了拷贝构造函数,就不会生成默认移动构造了,那么我们可以使用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:RightReference::string _name;int _age;
};int main()
{Person s1;Person s2 = s1;Person s3 = std::move(s1);return 0;
}

例如:Person类中只实现了拷贝构造函数,没有实现构造函数,由于拷贝构造函数本身也是构造函数,默认构造不再自动生成;

class Person
{
public://拷贝构造函数Person(const Person& p):_name(p._name),_age(p._age){}private:RightReference::string _name;int _age;
};int main()
{Person s1;//error 没有合适的默认构造函数使用return 0;
}

此时可以使用default关键字强制生成默认的构造函数,如下:

class Person
{
public:Person() = default;//拷贝构造函数Person(const Person& p):_name(p._name),_age(p._age){}private:RightReference::string _name;int _age;
};int main()
{Person s1;//error 没有合适的默认构造函数使用return 0;
}

禁止生成默认函数的关键字delete

C++98中,不期望某个类的对象被拷贝,得限制默认的拷贝构造函数的生成,一般的处理方式为将拷贝构造函数只声明不实现并且将此声明置于私有,如此外部调用时便会报错;

class Person
{
public:Person(const char* name=" ",int age=0):_name(name),_age(age){}
private://拷贝构造函数Person(const Person& p);RightReference::string _name;int _age;
};int main()
{Person s1("Linda", 20);Person s2 = s1;//errorreturn 0;
}

C++中只需要在拷贝构造函数的声明中加上=delete即可,该语法指示编译器不再生成拷贝构造函数的默认版本,称=delete修饰的函数为删除函数

class Person
{
public:Person(const char* name=" ",int age=0):_name(name),_age(age){}//拷贝构造函数Person(const Person& p) = delete;private:RightReference::string _name;int _age;
};int main()
{Person s1("Linda", 20);Person s2 = s1;//error 尝试引用已删除的函数return 0;
}

欢迎大家批评指正,博主会持续输出优质内容,谢谢各位观众老爷观看,码字画图不易,希望大家给个一键三连支持~ 你的支持是我创作的不竭动力~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3017565.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Baidu Comate:你的智能编程伙伴,编程界的AI革命者

文章目录 Baidu Comate 介绍Baidu Comate下载安装Baidu Comate 实操体验代码解释函数注释行间注释调优建议生成单测注释生成实时续写常用快捷方式智能对话问答 Baidu Comate 建议改进Baidu Comate 体验总结 Baidu Comate 介绍 Baidu Comate 智能编码助手 是基于文心大模型&…

【工作记录】openjdk-22基础镜像的构建

背景 近期使用到的框架底层都用的是springboot3.0&#xff0c;要求jdk版本在17甚至更高。 于是决定制作一个基于openjdk22的基础镜像&#xff0c;本文对这一过程进行记录。 作为记录的同时也希望能够帮助到需要的朋友。 期望效果 容器内可以正常使用java相关命令且版本是2…

浅谈操作系统中的重要概念——线程(3)——设计模式

文章目录 一、什么是设计模式&#xff1f;二、单例模式2.1、饿汉模式2.2、懒汉模式2.3、多线程情况下调用 饿汉模式与懒汉模式 谁是安全的&#xff1f;&#xff1f;&#xff08;重点&#xff09; 三、工厂模式 一、什么是设计模式&#xff1f; 设计模式就相当于菜谱&#xff0…

30万买智驾车,选特斯拉还是华为?

文 | AUTO芯球 作者 | 雷歌 我真是佩服马斯克&#xff0c; 一趟24小时的北京出差&#xff0c;就解除了Model车系进入机关单位禁令的问题&#xff0c; 也打开了特斯拉FSD完全自动驾驶进入中国市场的大门&#xff0c; 给我我一天时间&#xff0c;估计一部剧都追不完&#xf…

贡献思维,CF1644E. Expand the Path

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1644E - Codeforces 二、解题报告 1、思路分析 很容易想明白被…

暗区突围pc端资格发放了吗 暗区突围pc测试资格怎么获取

暗区突围pc端资格发放了吗 暗区突围pc测试资格怎么获取 暗区突围是一款很火爆的第一人称射击网游&#xff0c;现在终于要上线PC端啦&#xff01;小伙伴们是不是已经迫不及待想要体验电脑上的硬核射击快感了&#xff1f;暗区突围pc端资格已经陆续发放&#xff0c;想要参与PC端…

Adobe-Premiere-CEP 扩展 入门-视频剪辑-去气口插件-Silence Remover

短视频&#xff0c;这两年比较火&#xff0c;不要再问为什么用Premiere&#xff0c;非常难用&#xff0c;为什么不用某影&#xff0c;某些国内软件非常接地气简单&#xff0c;又例如某音资深的视频短编辑就很好用了。。。 Premiere二次开发调试难&#xff0c;不如自己搞个cons…

PNG、JPG如何转Dicom(dcm),那些年我踩过的坑(Python版)

Dicom作为医学影像的常见数据格式&#xff0c;是每个深耕于医疗AI的同学无法跳过的一个坑。虽然我只是一名扎根于算法部署方面的小白。但是也不可避免地接触到这类数据。这不&#xff0c;最近接到算法同学给出的算法&#xff0c;需要我自己找公开数据集进行测试。可是Dicom数据…

NFCP502-W05 电流数据是多少安培?

YOKOGAWA NFCP502-W05 是一款由横河电机&#xff08;Yokogawa Electric Corporation&#xff09;生产的微型断路器&#xff08;Microcircuit Breaker&#xff0c;简称 MCB&#xff09;。 横河电机是一家日本的跨国公司&#xff0c;专注于自动化和控制系统、仪器和其他相关设备…

【计算机科学速成课】笔记三

文章目录 17.集成电路真空管时代晶体管时代集成电路时代印刷电路板时代光刻时代 17.集成电路 Over the past six episodes, we delved into software, 过去 6 集我们聊了软件 \N 从早期编程方式到现代软件工程 from early programming efforts to modern software engineerin…

Linux进程地址空间第三讲

至今为止&#xff0c; 我们所学到的大多数的知识&#xff0c; 包括语言&#xff0c; 数据结构&#xff0c; 动静态库等等的 都是在下面这3G&#xff0c; 也就是用户空间里的(进程等待&#xff0c; 信号之类的与内核有关的是在上面那1G里的) 所以对于我们来说&#xff0c; 我们…

NXP i.MX8系列平台开发讲解 - 1.1 导读前言

专栏文章目录传送门&#xff1a;返回专栏目录 文章目录 目录 1. 本专辑介绍 2. 学习本专辑作用 3.关于作者 1. 本专辑介绍 本专辑将会介绍Linux 驱动开发&#xff0c;Android BSP 驱动涉及HAL层调试&#xff0c;适用于嵌入式软件开发人员&#xff0c;和有兴趣向该方向发展…

题目----力扣--移除链表元素

题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a; 输入&…

1-2 ARM单片机GPIO

def&#xff1a;通用输入输出口 GPIO输出模式原理讲解 1&#xff1a;推挽输出 2&#xff1a;复用推挽输出 电流最大是20mA&#xff0c;对于单片机来说总体的输出是由范围的 开漏/复用开漏输出 外部接上拉电阻的开漏输出 线与的概念 注&#xff1a; 与的概念&#xff1a;全1为1&…

动态内存开辟(下)

前言 动态内存开辟以及柔性数组的介绍 一、 几个经典的笔试题 1. 题目一 void Getmemory(char*p) {p (char*)malloc(100); } int main() {char* str NULL;Getmemory(str);strcpy(str, "hello world");printf(str);return 0; } 这段代码我们可以发现两个很明显…

2-5 任务:打印九九表

本次实战的目标是通过编写程序实现打印九九乘法表、字符矩形、字符平行四边形和字符菱形等图形&#xff0c;以及解决百钱买百鸡问题和输出素数等实际问题。在实战过程中&#xff0c;我们将学习并掌握以下知识点。 双重循环的使用&#xff1a;通过双重循环实现九九乘法表的打印&…

视频素材库在哪里找免费手机版?8个可以用手机浏览的素材网

在视觉内容占据主导地位的今天&#xff0c;合适的视频素材可以大大提升项目的吸引力和效果。以下列出的视频素材网站为广告制作者、社交媒体策略师及电影制作人提供了从传统到现代风格的各种视频素材选择&#xff0c;满足不同的创作需求。 1. 蛙学府&#xff08;中国&#xff…

大模型系列之解读MoE

Mixtral 8x7B 的推出&#xff0c; 使我们开始更多地关注 基于MoE 的大模型架构&#xff0c; 那么&#xff0c;什么是MoE呢&#xff1f; 1. MoE溯源 MoE的概念起源于 1991 年的论文 Adaptive Mixture of Local Experts&#xff08;https://www.cs.toronto.edu/~hinton/absps/jjn…

艺术的新领域——探索元宇宙艺术展带来的沉浸式艺术体验

在数字化的浪潮中&#xff0c;元宇宙艺术展成为了一种全新的展览形式&#xff0c;它通过虚拟现实、3D建模技术和互动平台&#xff0c;将传统艺术与现代科技巧妙结合&#xff0c;提供了一种前所未有的艺术欣赏方式。此类展览不仅展示了艺术作品的新颖呈现&#xff0c;还为参观者…