目录
迭代器
智能指针
引用
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