【C++】C++11语法 ~ 可变参数模板
2023-04-18 15:40:15 时间
🌈欢迎来到C++专栏~可变参数模板
- (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort
- 目前状态:大三非科班啃C++中
- 🌍博客主页:张小姐的猫~江湖背景
- 快上车🚘,握好方向盘跟我有一起打天下嘞!
- 送给自己的一句鸡汤🤔:
- 🔥真正的大师永远怀着一颗学徒的心
- 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏
- 🎉🎉欢迎持续关注!
文章目录
一. 类的新功能
🥑默认成员函数
C++11之后,有八个默认成员函数
在C++11之前,一个类中有如下六个默认成员函数:
- 构造函数
- 析构函数
- 拷贝构造函数
- 拷贝赋值函数
- 取地址重载函数
- const取地址重载函数
其中前四个成员函数最重要,后面两个成员函数一般不会用到,这里“默认”的意思就是你不写编译器会自动生成。在C++11标准中又增加了两个默认成员函数,分别是移动构造函数和移动赋值重载函数
✨默认移动构造和移动赋值的生成条件
- 默认移动构造生成条件:没有自己实现移动构造函数,并且没有自己实现析构函数、拷贝构造函数和拷贝赋值函数的任意一个
- 移动赋值重载函数的生成条件:没有自己实现移动赋值重载函数,并且没有自己实现析构函数、拷贝构造函数和拷贝赋值函数
😎特别注意: 如果我们自己实现了移动构造或者移动赋值,就算没有实现拷贝构造和拷贝赋值,编译器也不会生成默认的拷贝构造和拷贝赋值
默认生成的移动构造和移动赋值会做什么?
- 对于内置类型的成员会完成值拷贝(浅拷贝),对于自定义类型的成员,如果该成员实现了移动构造/移动赋值就调用它的移动构造/移动赋值,否则就调用它的拷贝构造
对此我们展开验证,这里需要模拟实现一个简化版的string类,类当中只编写了几个我们需要用到的成员函数。
代码如下:
namespace ljj
{
class string
{
public:
typedef char* iterator;
iterator begin()
{
return _str; //返回字符串中第一个字符的地址
}
iterator end()
{
return _str + _size; //返回字符串中最后一个字符的后一个字符的地址
}
//构造函数
string(const char* str = "")
{
_size = strlen(str); //初始时,字符串大小设置为字符串长度
_capacity = _size; //初始时,字符串容量设置为字符串长度
_str = new char[_capacity + 1]; //为存储字符串开辟空间(多开一个用于存放'