[C++] C++11类和STL的新特性

1. 新的类功能

1.1 默认移动构造 / 移动赋值

C++11中,类新增了移动构造和移动赋值成员函数:

  • 在没有实现析构 / 拷贝构造 / 拷贝赋值时,编译器会默认生成移动构造 / 移动赋值
  • 内置类型:默认函数执行浅拷贝
  • 自定义类型:有移动走移动构造 / 赋值,否则走拷贝构造 / 赋值

如果提供了移动函数,编译器就不会再默认生成拷贝函数。

cpp 复制代码
class Person
{
public:
	Person(const char* name = "LiHua", int age = 0)
		:_name(name)
		, _age(age)
	{
	}
private:
	mzh::string _name;
	int _age;
};
int main()
{
	Person s1; //构造
	Person s2 = s1; //拷贝构造
	Person s3 = move(s1); //移动构造
	cout << endl;

	Person s4; //构造
	s4 = s2; //拷贝赋值
	s4 = move(s2); //移动赋值
	return 0;
}

输出:

1.2 default / delete / final / override

1.2.1 default和delete

  1. =default:指定编译器生成对应的默认成员函数
  2. =delete:禁止编译器生成对应的默认成员函数(应用:线程和IO流)

default的使用示例:

cpp 复制代码
class Person
{
public:
	Person(const char* name = "LiHua", int age = 0)
		:_name(name)
		, _age(age)
	{
	}
	
	Person(Person& p) = default;

private:
	mzh::string _name;
	int _age;
};
int main()
{
	Person s1; //构造
	Person s2 = s1; //拷贝构造
	return 0;
}

输出:

delete的使用示例:

cpp 复制代码
class Person
{
public:
	Person(const char* name = "LiHua", int age = 0)
		:_name(name)
		, _age(age)
	{}
	
	Person(Person& p) = delete;

private:
	mzh::string _name;
	int _age;
};
int main()
{
	Person s1; //构造
	Person s2 = s1; //无法拷贝构造
	return 0;
}

报错信息C2280:

总结:

  • 显式写移动,就不会生成拷贝
  • 显式写拷贝或析构,就不会生成移动

因此,想让拷贝和移动并存,必须全都显式声明(=default)。

1.2.2 final和override

  • final:位于基类类名后,作为不可继承的类;位于类内成员函数后,作为不可重写的函数
  • override:位于派生类的重写函数后,检测是否完成重写

使用示例:

cpp 复制代码
class Person
{
public:
    virtual void Print()
    {
        //...
    }
};

class Student: public Person
{
public:
    virtual void Print() override
    {
        //...
    }
};

class LiHua: public Student
{
public:
    virtual void Print() override
    {
        //...
    }
};

以上代码可以正常编译通过。但如果将Student类加上final关键字,就会发生编译错误:

cpp 复制代码
class Person
{
public:
    virtual void Print()
    {
        //...
    }
};

class Student final: public Person //添加了final
{
public:
    virtual void Print() override
    {
        //...
    }
};

class LiHua: public Student
{
public:
    virtual void Print() override
    {
        //...
    }
};

1.3 声明缺省值

C++11新增了可以在声明成员变量的同时给缺省值,具体的初始化规则可以参考作者的此篇文章:

C++:构造函数与初始化列表详解

使用示例:

cpp 复制代码
class Date
{
private:
    int _year = 2000;
    int _month = 1;
    int _day = 1;

public:
    //...
};

2. STL新变化

  1. 新容器:最有代表性的是unordered_set和unordered_map
  2. 新接口:右值引用和移动语义,emplace系列(支持构造+插入)构造方式(列表初始化和initializer_list),迭代器cbegin、cend等等
  3. 遍历:范围for

其他新增容器:

相关推荐
布吉岛的石头9 小时前
Java 程序员第 50 阶段3:数据工程:预训练语料清洗与去重
java·开发语言·人工智能·深度学习·transformer
benchmark_cc9 小时前
QuantDash 安装成功后,如何验证 Python 环境可以正常导入 SDK?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
学逆向的9 小时前
C 内存属性
c语言·开发语言·算法·网络安全
lengxuenong10 小时前
树状数组 · 信息学学习手册1-求和3个模板
c++·学习·算法·青少年编程
ShineWinsu10 小时前
对于Qt:信号与槽的解析
c++·qt·gui·lambda·信号·信号与槽·槽函数
WL学习笔记11 小时前
使用string类
c++·后端·string类
xxxiugou12311 小时前
链表算法题精讲:从两数相加到K组翻转
数据结构·c++·算法·链表
HAPPY酷11 小时前
C++ 自定义内存池优化点云处理:从裸指针到 RAII 自动回收
开发语言·c++
梦帮科技11 小时前
量子纠缠网络与量子隐形传态攻防:量子中继器信道串扰、纠缠态保真度降解与量子路由劫持
开发语言·网络·人工智能·算法·自动化·php