C++学习目录

目录

迭代器

智能指针

引用

C++标准

C++ 11
C++ 14
C++ 17
C++ 20
C++ 23

C++特性

std::is_same
std::remove_reference
std::remove_reference_t
std::_Const_thru_ref
std::_Remove_cvref_t
std::remove_cv
std::remove_cv_t
std::remove_const
std::remove_const_t
std::remove_volatile
std::remove_volatile_t
std::auto_ptr
std::unique_ptr
std::shared_ptr
std::weak_ptr
std::enable_if_t
std::enable_shared_from_this

#include <string>
#include <iostream>
using namespace std;

void Feature_auto()
{
	auto a = 1;					// int	
	auto b = 1.f;				// float
	auto c = 2.0;				// double
	auto d = "123";				// const char *
	auto e = string("123");		// string
	auto f = &e;				// string *
	auto g = (const int *)&a;	// const int *
}

void Feature_is_same()
{
	std::is_same<int, int>();
}

void Feature_remove_reference()
{
	auto a1 = std::remove_reference<int &>::type();		// int
	auto a2 = std::remove_reference<int &&>::type();	// int
	auto a3 = std::remove_reference<int*>::type();		// int *
	std::remove_reference<int*>::type a4;				 // int *
	std::remove_reference<int*>::_Const_thru_ref_type a5 = &a1; // const int *

	remove_reference_t<int&> b1;
	_Const_thru_ref<int&>   b2 = b1;
}

/*
	std::auto_ptr:
		有拷贝构造函数
		get() 获取指针
		reset()
*/
void Feature_auto_ptr()
{
/*
output:
	ap1 00000213068CD8A0
	*ap1 10
	ap1 0000000000000000
	ap2 00000213068CD8A0
	*ap2 10

*/
	std::auto_ptr<int> ap1(new int(10));
	cout << "ap1 " << ap1.get() << endl;
	cout << "*ap1 " << *ap1 << endl;
	std::auto_ptr<int> ap2(ap1);
	cout << "ap1 " << ap1.get() << endl;
	cout << "ap2 " << ap2.get() << endl;
	cout << "*ap2 " << *ap2 << endl;
}
/*
	std::unique_ptr:
		没有拷贝构造函数
		get() 获取指针
		reset()
*/
void Feature_unique_ptr()
{
/*
output:
	up1 0000026130E7E040
	up1.get() 0000026130E7E040
	*up1 11
	up1 0000000000000000
	up1.get() 0000000000000000
	up2 0000026130E7E040
	up2.get() 0000026130E7E040
	*up2 11
	TestClass construtor
	up3 0000026130E7DFF0
	up3.get() 0000026130E7DFF0
	up4 0000026130E7DFF0
	up4.get() 0000026130E7DFF0
	~TestClass deconstrutor
*/
	class TestClass {
	public:
		TestClass() {
			cout << "TestClass construtor" << endl;
		}
		~TestClass() {
			cout << "~TestClass deconstrutor" << endl;
		}
	};

	std::unique_ptr<int> up1(new int(11));
	cout << "up1 " << up1 << endl;
	cout << "up1.get() " << up1.get() << endl;
	cout << "*up1 " << *up1 << endl;
	//std::unique_ptr<int> up2(up1);  // 没有拷贝构造函数
	std::unique_ptr<int> up2(std::move(up1)); // 可以move
	cout << "up1 " << up1 << endl;		// 编译器提示"已移动的对象"
	cout << "up1.get() " << up1.get() << endl;
	cout << "up2 " << up2 << endl;
	cout << "up2.get() " << up2.get() << endl;
	cout << "*up2 " << *up2 << endl;

	std::unique_ptr<TestClass> up3(new TestClass());
	cout << "up3 " << up3 << endl;
	cout << "up3.get() " << up3.get() << endl;
	std::unique_ptr<TestClass> up4(std::move(up3));
	cout << "up4 " << up4 << endl;
	cout << "up4.get() " << up4.get() << endl;
}

/*
	std::shared_ptr:
		有拷贝构造函数
		reset()
		reset (ponit p)
		get()	获取指针
		use_count()	获取引用数
		std::move 引用数减1
		unique()
*/
void Feature_shared_ptr()
{
/*
output:
	TestClass construtor
	up1.use_count()1
	up1 0000021DD1CCD8A0
	up1.get() 0000021DD1CCD8A0
	up2 0000021DD1CCD8A0
	up2.get() 0000021DD1CCD8A0
	up1.use_count()2
	up2.use_count()2
	up1 0000000000000000
	up1.get() 0000000000000000
	up2 0000021DD1CCD8A0
	up2.get() 0000021DD1CCD8A0
	up3 0000021DD1CCD8A0
	up3.get() 0000021DD1CCD8A0
	up1.use_count()0
	up2.use_count()2
	up3.use_count()2
	~TestClass deconstrutor
*/
	class TestClass {
	public:
		TestClass() {
			cout << "TestClass construtor" << endl;
		}
		~TestClass() {
			cout << "~TestClass deconstrutor" << endl;
		}
	};

	std::shared_ptr<TestClass> up1(new TestClass());
	cout << "up1.use_count()" << up1.use_count() << endl;
	std::shared_ptr<TestClass> up2(up1);
	cout << "up1 " << up1 << endl;
	cout << "up1.get() " << up1.get() << endl;
	cout << "up2 " << up2 << endl;
	cout << "up2.get() " << up2.get() << endl;
	cout << "up1.use_count()" << up1.use_count() << endl;
	cout << "up2.use_count()" << up2.use_count() << endl;
	std::shared_ptr<TestClass> up3(std::move(up1));
	cout << "up1 " << up1 << endl;					
	cout << "up1.get() " << up1.get() << endl;
	cout << "up1.use_count()" << up1.use_count() << endl;
	cout << "up2 " << up2 << endl;
	cout << "up2.get() " << up2.get() << endl;
	cout << "up2.use_count()" << up2.use_count() << endl;
	cout << "up3 " << up3 << endl;
	cout << "up3.get() " << up3.get() << endl;
	cout << "up3.use_count()" << up3.use_count() << endl;

	up2.reset(new TestClass());
	cout << "up2 " << up2 << endl;
	cout << "up2.get() " << up2.get() << endl;
	cout << "up2.use_count()" << up2.use_count() << endl;
	cout << "up3 " << up3 << endl;
	cout << "up3.get() " << up3.get() << endl;
	cout << "up3.use_count()" << up3.use_count() << endl;
}

C++ 11新特性

auto
decltype
右值引用
列表初始化
std::function和std::bind
lambda表达式
基于范围的for循环
委托构造函数
继承构造函数
final
final和 override
default
delete
explicit
constexpr
enum class
正则表达式regex
时间库chrono

C++ 14新特性

C++ 17 新特性

构造函数模板推导
结构化绑定
if-switch语句初始化
内联变量
折叠表达式
constexpr lambda表达式
namespace嵌套
__has_include预处理表达式
在lambda表达式用*this捕获对象副本
新增Attribute
字符串转换
std::variant
std::optional
std::any
std::apply
std::make_from_tuple
as_const
std::string_view
file_system
std::shared_mutex

智能指针

std::shared_ptr
std::weak_ptr
std::unique_ptr

C++ 20 新特性

封装, 多态, 继承
重载、重写(覆盖)和隐藏

构造函数

默认构造函数 default constructor
拷贝构造函数 copy constructor
移动构造函数 copy constructor

关键字

= default
= delete
constexpr
noexcept
inline

模板

特性

std::is_convertible
std::decay_t
std::is_integral
std::declval
std::enable_if_t
std::is_arithmetic
std::conjunction_v
std::initializer_list
std::tie
std::forward
std::move
std::function
std::future
std::bind
std::for_each
std::size_t
std::ptrdiff_t
std::remove_reference

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值