[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

其他新增容器:

相关推荐
沙漠之主1 分钟前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
朝朝辞暮i11 分钟前
C++ 第 29 课:回调函数 Callback
开发语言·c++·算法
笨笨饿15 分钟前
140_AI新手村MCP与Skills是干嘛的
开发语言·人工智能·python·stm32·单片机·嵌入式硬件·物联网
YOLO数据集集合39 分钟前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化
kaixin_learn_qt_ing43 分钟前
C++多态实现原理
c++
无名猿1 小时前
unique_ptr 完全指南:独占所有权与零开销
c++·性能优化·内存管理·标准库·现代c++
笑鸿的学习笔记1 小时前
C++笔记之大块顺序写
java·c++·笔记
无名猿2 小时前
对象构造与析构顺序全解:声明顺序、继承链与逆序析构
c++·内存管理·调试技巧·现代c++
殷色玫瑰2 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·linux·c语言·c++
C++ 老炮儿的技术栈2 小时前
不一样的数值交换
数据结构·c++·人工智能·算法·c·csdn开发云