c++11笔记

简介:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
constexpr        :会在编译期计算出来
lambda:
是98、03版带有operator()的局部仿函数
当创建lambda函数的时候,编译器内部会生成这样一个仿函数,并从其你作用域中取得参数传递给lambda函数
#############################################################################################
__func__        :只能在函数内部使用,参数不行
#pragma once = _Pragma("once")
区别是,一个是宏,一个是操作符(预编译期也可使用)
#define PR(...) printf(__VA_ARGS__)
__LINE__,__FILE__只在宏函数中起作用,在普通函数中不起作用
__cplusplus 宏已定义成一个具体数字,比如:201103L
long  long  printf  时 lld llu
编译期:static_assert(),需要的是常量参数
 
noexcept()        默认noexcept( true ),没有声明noexcept的函数,都是默认声明noexcept( true ) 的
template  < class  T>
void  fun() noexcept(noexcept(T())) {}
第二个noexcept是运算符
 
成员在定义时就初始化,相当于加在构造函数退出前初始化
sizeof  可以计算类的非静态成员了
sizeof (A::a) or  sizeof (a.a)
 
friend  可以省去 class 关键字,也可以应用于被  typedef  过的别名了,也可以应用于模板参数 class  P;
template  < typename  T>  class  People {
friend  T;
};
 
final:使用 virtual 接口无法子类重写
override 是必须重写
模板默认参数:
template < typename  T =  int  >
     class  Test{};
      
函数模板默认参数的位置不受限制,模板类默认参数参照函数的默认参数的规则
默认模板参数通常是需要跟默认函数参数一起使用的
 
外部模板:作用参考 extern  一个变量,用法也一样,即声明到一个头文件中
为了减少编译时间,即明确表明不需要实例化。
extern  template  void  test< int >();
显式实例化:
template  void  fun< int >( int );
#############################################################################################
类继承时,子类想使用可以 using  ,这种做法叫透传,透传也可以用在子类的构造函数上,而且只用一个 using 就可以
using  A::A;  // 继承构造函数
透传多个重载的构造函数
 
委托构造:需要一个通用的初始化构造函数
 
构造函数可能调用其他重载的构造函数:这种做法叫委派,这时的委派构造函数就相当于一个普通函数
test( int  i)
try :m_i(i)
{
}
catch (...)
{}
 
左值:有名称,可取地址
将亡值:std::move后的
T&&: 右值的引用
T&:  左值的引用
右值:不可取地址,不可赋值
改变生存期
移动
 
std::move 基本等同于一个类型转换: static_cast <T&&>(lvalue);
通常就是一个 static_cast
 
被转化的左值,其生命期并没有随着左右值的转化而改变
移动构造,注意原来的实例已经不能再用。
应该尽量编写不抛出异常的移动构造函数,通过为其添加一个noexcept
关键字,可以保证移动构造函数中抛出来的异常会直接调用terminate 程序终止运行,而不是
造成指针悬挂的状态
 
所谓完美转发(perfect forwarding),是指在函数模板中,完全依照模板的参数的类型,
将参数传递给函数模板中调用的另外一个函数。
转发:引用折叠(作为函数参数)
TR 的类型定义    声明v 的类型     v 的实际类型
T&              TR              A&
T&              TR&             A&
T&              TR&&            A&
T&&             TR              A&&
T&&             TR&             A&
T&&             TR&&            A&&
定义中出现了左值引用,引用折叠总是优先将其折叠为左值引用
在类方面,多了移动构造函数和移动赋值函数
 
显示转换函数:
explicit  operator  bool ()  const  { ... }
 
{}初始化一切都可以了
 
POD:兼容C, class 要是平凡的; class 对象的布局要是标准的。
平凡的:无自定义构造/析构函数,无赋值,拷贝构造函数及其移动版;无虚函数。
标准的:所有的非静态成员函数具有相同的访问权限;多重继承没有导致内存布局上变化的。
 
bool  operator  ""  _C()
inline  namespace
using  模板别名: using  aa=vector< int >
#############################################################################################
改进>
auto
auto 可以用在宏中。
auto  非静态成员变量, auto  函数参数, auto  数组 不行。
auto  知道类型想简写, decltype  知道类型想使用此类型。
 
decltype  使用于范型, decltype 有推导规则,只适用于表达式,不适用于函数名。
decltype  会使 const  或 valotile 失效,即成员不会继承对象的这些属性。
追踪函数的返回类型:->type
for ( auto  e:...)         /// 不修改元素内容
for ( auto & e:...)     /// 修改元素内容
for ( const  auto & e:...)    gcc 编译也没错
#############################################################################################
enum  class  Type{}:强类型枚举值(不允许隐式转换)
delete  [] nullptr:ok
unique_ptr,shared_ptr参见参考右值特性来使用,weak_ptr,只有引用但没有计数,与shared_ptr合用
#############################################################################################
编译时常量:constexpr, const  运行时
 
变长模板:
template  < typename  ... element>  class  tuple;
element:模板参数包
实现:递归继承(模板类继承),有三个步骤
1,普通变长模板声明
2,递归定义
3,递归结束:
template <>
     已定义的模板类名字
     {
         用于继承的数据成员
     }
变长模板函数的话,内部也要递归实现
sizeof ...(),计算变长参数个数
 
template < typename  ... A>  class  T:  public  B(A)...{};
template < typename  ... A>  class  T:  public  B(A...){};
扩展是不一样的。
 
多线程
cstdlib: atexit     (C的退出注册函数)
c++11,at_quick_exit,at_exit(正常退出)
terminate, abort :异常退出
 
#############################################################################################
默认函数操作符
operator,
operator&
operator&&
operator*
operator->
operator->*
operator  new
operator  delete
声明了构造函数,导致非POD
= default         显式默认
=deleted        删除默认
 
lambda:     // 默认是一个const 函数
[]() mutable -> return -type
{}
[var]  按值传递单个变量
[=],按值传递所有父作用域的变量(包括 this
[&var]
[&]        按引用传递所有父作用域的变量(包括 this
 
以上变量,只能是自动变量,即不能是全局及静态变量
以上可以混用
本质是一个类,重载了 operator() ,可以带参数,A a; a();
按值传递时,变量值只计算一次,按引用时,在调用时计算
 
by_ref_lambda        ref;
by_val_lambda         const ;
alignof:查看对齐
alginas:设定对齐
 
c++原生字符串
R "hello"
R可与以下字符前缀一起使用。
 
字符串前缀(表示编码方式)
u8  u  u32    (u 表示 unicode)  L(表示w_char)
\u4个16进制字符   表示某个UTF-16字符
\U8个16进制字符   表示某个UTF-32字符









本文转自 hakuyo 51CTO博客,原文链接:http://blog.51cto.com/hakuyo/1766681,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
Java 编译器 C++
C++入门指南:类和对象总结笔记(下)
C++入门指南:类和对象总结笔记(下)
30 0
|
2月前
|
存储 编译器 C语言
C++入门: 类和对象笔记总结(上)
C++入门: 类和对象笔记总结(上)
34 0
|
4月前
|
设计模式 安全 编译器
Effective C++55 笔记
Effective C++55 笔记
23 0
|
7月前
|
消息中间件 存储 前端开发
[笔记]C++并发编程实战 《四》同步并发操作(三)
[笔记]C++并发编程实战 《四》同步并发操作(三)
|
9天前
|
安全 Java 程序员
【C++笔记】从零开始认识继承
在编程中,继承是C++的核心特性,它允许类复用和扩展已有功能。继承自一个基类的派生类可以拥有基类的属性和方法,同时添加自己的特性。继承的起源是为了解决代码重复,提高模块化和可维护性。继承关系中的类形成层次结构,基类定义共性,派生类则根据需求添加特有功能。在继承时,需要注意成员函数的隐藏、作用域以及默认成员函数(的处理。此外,继承不支持友元关系的继承,静态成员在整个继承体系中是唯一的。虽然多继承和菱形继承可以提供复杂的设计,但它们可能导致二义性、数据冗余和性能问题,因此在实际编程中应谨慎使用。
14 1
【C++笔记】从零开始认识继承
|
2月前
|
编译器 C语言 C++
C++入门指南:类和对象总结笔记(中)
C++入门指南:类和对象总结笔记(中)
49 0
|
3月前
|
机器学习/深度学习 算法 编译器
【C++】自学终极笔记
【C++】自学终极笔记
152 0
|
4月前
|
存储 算法 C++
《C++ STL开发技术引导》 第五章-C++ STL泛化技术分析笔记
《C++ STL开发技术引导》 第五章-C++ STL泛化技术分析笔记
|
4月前
C++2.0(C++11) 笔记 二
C++2.0(C++11) 笔记 二
20 0
|
4月前
|
编译器 容器
C++11 (C++2.0)笔记 一
C++11 (C++2.0)笔记 一
34 0