实例介绍
【实例简介】C 基础课件和源代码
C 比较详细的手册
【实例截图】
【核心代码】
1、Windows开发环境的准备 PAGEREF _Toc4803 \h 34
1)下载Visual Studio 2022安装文件 PAGEREF _Toc16912 \h 34
2)安装Visual Studio 2022 PAGEREF _Toc20157 \h 35
2、Linux开发环境 PAGEREF _Toc28524 \h 36
3、第一个C 程序 PAGEREF _Toc13801 \h 37
1)用VS生成最简单的C 程序 PAGEREF _Toc12996 \h 37
2)运行C 程序 PAGEREF _Toc11628 \h 39
4、C 输出数据 PAGEREF _Toc9250 \h 40
1)数据的分类 PAGEREF _Toc16224 \h 40
5、程序的注释 PAGEREF _Toc24933 \h 41
1)单行注释 PAGEREF _Toc18003 \h 41
2)多行注释 PAGEREF _Toc15166 \h 41
3)注释的注释 PAGEREF _Toc24780 \h 41
4)VS中的快捷键 PAGEREF _Toc21729 \h 42
6、使用变量 PAGEREF _Toc19794 \h 43
1)声明变量 PAGEREF _Toc16181 \h 43
2)变量的赋值 PAGEREF _Toc30438 \h 43
7、使用常量 PAGEREF _Toc23500 \h 44
2)const修饰的变量 PAGEREF _Toc20167 \h 44
3)常量的特点 PAGEREF _Toc15055 \h 45
8、标识符的命名 PAGEREF _Toc25858 \h 45
1)C 命名规则 PAGEREF _Toc27142 \h 45
2)C 关键字 PAGEREF _Toc2426 \h 46
9、输入数据 PAGEREF _Toc31502 \h 47
1)用std::cin输入数据 PAGEREF _Toc25652 \h 47
11、自增和自减 PAGEREF _Toc28470 \h 49
12、赋值运算 PAGEREF _Toc5080 \h 50
1)赋值运算 PAGEREF _Toc21266 \h 50
13、C 11初始化赋值 PAGEREF _Toc25048 \h 51
1)C 和C 11初始化赋值 PAGEREF _Toc30081 \h 51
14、关系运算 PAGEREF _Toc3328 \h 52
1)关系运算 PAGEREF _Toc25598 \h 52
15、逻辑运算 PAGEREF _Toc19385 \h 55
1)逻辑运算 PAGEREF _Toc24971 \h 55
16、逗号运算 PAGEREF _Toc20635 \h 56
17、运算的优先级 PAGEREF _Toc9416 \h 57
1)运算的优先级 PAGEREF _Toc18623 \h 57
18、if语句的基本结构 PAGEREF _Toc30836 \h 62
19、嵌套使用if语句 PAGEREF _Toc4344 \h 63
1)嵌套使用if语句 PAGEREF _Toc23309 \h 63
20、嵌套if语句的坑 PAGEREF _Toc942 \h 66
if (sex == 'X') PAGEREF _Toc28764 \h 66
21、多条件的if语句 PAGEREF _Toc5444 \h 66
1)多条件的if语句 PAGEREF _Toc27108 \h 66
22、if语句中的逻辑表达式 PAGEREF _Toc31793 \h 68
23、三目运算 PAGEREF _Toc6827 \h 69
24、switch语句 PAGEREF _Toc23101 \h 70
25、while循环语句 PAGEREF _Toc4346 \h 70
26、循环的跳转 PAGEREF _Toc31000 \h 71
if (once == false) PAGEREF _Toc5549 \h 72
27、for循环语句 PAGEREF _Toc4946 \h 73
28、嵌套使用循环 PAGEREF _Toc27048 \h 75
for (int jj = 1; jj <= ii; jj ) PAGEREF _Toc23685 \h 75
29、do…while循环语句 PAGEREF _Toc14142 \h 76
30、goto语句 PAGEREF _Toc3671 \h 76
31、函数的声明和定义 PAGEREF _Toc4014 \h 77
for (int jj = 1; jj <= ii; jj ) PAGEREF _Toc626 \h 79
32、函数的调用 PAGEREF _Toc26047 \h 79
for (int jj = 1; jj <= ii; jj ) PAGEREF _Toc26939 \h 81
33、变量的作用域 PAGEREF _Toc30227 \h 82
1)全局变量 PAGEREF _Toc27477 \h 82
2)局部变量 PAGEREF _Toc21281 \h 82
3)静态局部变量 PAGEREF _Toc13365 \h 82
4)注意事项 PAGEREF _Toc14845 \h 83
34、函数参数的传递 PAGEREF _Toc5711 \h 83
35、函数分文件编写 PAGEREF _Toc15950 \h 84
36、VS中调试程序 PAGEREF _Toc15776 \h 86
37、递归函数 PAGEREF _Toc3886 \h 87
38、sizeof运算符 PAGEREF _Toc19366 \h 88
39、整型的基本概念 PAGEREF _Toc25540 \h 89
40、整数的书写 PAGEREF _Toc20488 \h 91
int c = 0B100001; // 换算成十进制为 33 PAGEREF _Toc27509 \h 91
int m = 256; // 无前缀 0,相当于十进制 PAGEREF _Toc5765 \h 92
3、十六进制 PAGEREF _Toc15724 \h 92
int a = 0X2A; // 换算成十进制为 42 PAGEREF _Toc5282 \h 92
4、需要注意的坑 PAGEREF _Toc4650 \h 92
41、C 11的long long类型 PAGEREF _Toc6983 \h 93
42、浮点型(实数型) PAGEREF _Toc6465 \h 93
43、字符型的基本概念 PAGEREF _Toc14353 \h 94
1)ASCII 控制字符 (0~31) PAGEREF _Toc9053 \h 95
2)ASCII 可显示字符 (32~127) PAGEREF _Toc5235 \h 95
3)字符的本质 PAGEREF _Toc18868 \h 98
// 'X' -> 88 'a'->97 '3'->51 PAGEREF _Toc27671 \h 99
44、转义字符 PAGEREF _Toc27497 \h 99
// 换行符 ASCII值是10 书写用\n PAGEREF _Toc29486 \h 100
45、C 11的原始字面量 PAGEREF _Toc24354 \h 100
// 使用C 11原始字面量 PAGEREF _Toc5170 \h 101
46、字符串型 PAGEREF _Toc16939 \h 102
47、布尔型 PAGEREF _Toc26870 \h 103
48、数据类型的转换 PAGEREF _Toc23006 \h 104
1)自动类型转换 PAGEREF _Toc12535 \h 104
2)强制类型转换 PAGEREF _Toc24878 \h 105
49、数据类型的别名typedef PAGEREF _Toc22329 \h 106
50、指针的基本概念 PAGEREF _Toc11127 \h 107
1)变量的地址 PAGEREF _Toc27723 \h 107
2)指针变量 PAGEREF _Toc3859 \h 108
3)对指针赋值 PAGEREF _Toc23840 \h 108
4)指针占用的内存 PAGEREF _Toc23866 \h 108
51、使用指针 PAGEREF _Toc13782 \h 109
52、指针用于函数的参数 PAGEREF _Toc6710 \h 110
53、用const修饰指针 PAGEREF _Toc30636 \h 112
1)常量指针 PAGEREF _Toc32760 \h 112
3)常指针常量 PAGEREF _Toc26254 \h 113
54、void关键字 PAGEREF _Toc26629 \h 114
1)函数的返回值用void,表示函数没有返回值。 PAGEREF _Toc18698 \h 114
int func(void) PAGEREF _Toc2927 \h 115
3)的形参用void *,表示接受任意数据类型的指针。 PAGEREF _Toc4821 \h 115
55、C 内存模型 PAGEREF _Toc21519 \h 116
56、动态分配内存new和delete PAGEREF _Toc145 \h 117
57、二级指针 PAGEREF _Toc30953 \h 118
58、空指针 PAGEREF _Toc21821 \h 120
1)使用空指针的后果 PAGEREF _Toc9474 \h 120
2)C 11的nullptr PAGEREF _Toc23328 \h 120
59、野指针 PAGEREF _Toc3443 \h 121
60、函数指针 PAGEREF _Toc27050 \h 122
1)声明函数指针 PAGEREF _Toc26595 \h 123
2)函数指针的赋值 PAGEREF _Toc12108 \h 123
3)函数指针的调用 PAGEREF _Toc25286 \h 123
61、一维数组的基本概念 PAGEREF _Toc31590 \h 125
1)创建数组 PAGEREF _Toc26575 \h 125
2)数组的使用 PAGEREF _Toc20841 \h 125
3)数组占用内存的情况 PAGEREF _Toc21258 \h 126
4)数组的初始化 PAGEREF _Toc29197 \h 126
5)清空数组 PAGEREF _Toc19392 \h 126
6)复制数组 PAGEREF _Toc29469 \h 127
62、一维数组和指针 PAGEREF _Toc5529 \h 128
1)指针的算术 PAGEREF _Toc671 \h 128
2)数组的地址 PAGEREF _Toc9102 \h 128
e)C 编译器把 数组名[下标] 解释为 *(数组首地址 下标) PAGEREF _Toc6257 \h 128
3)数组的本质 PAGEREF _Toc17321 \h 128
4)数组名不一定会被解释为地址 PAGEREF _Toc12683 \h 128
int main() PAGEREF _Toc12722 \h 129
63、一维数组用于函数的参数 PAGEREF _Toc19076 \h 131
1)指针的数组表示 PAGEREF _Toc4140 \h 131
C 编译器把 数组名[下标] 解释为 *(数组首地址 下标) PAGEREF _Toc15117 \h 131
2)一维数组用于函数的参数 PAGEREF _Toc592 \h 131
int main() PAGEREF _Toc25217 \h 132
64、用new动态创建一维数组 PAGEREF _Toc14068 \h 133
int main() PAGEREF _Toc21946 \h 134
65、一维数组的排序qsort PAGEREF _Toc29557 \h 134
typedef unsigned long long size_t PAGEREF _Toc206 \h 135
66、一维数组的查找-折半查找 PAGEREF _Toc26395 \h 136
int search(int arr[], int len, int key) PAGEREF _Toc858 \h 136
67、C风格的字符串 PAGEREF _Toc4765 \h 137
1)初始化方法 PAGEREF _Toc1158 \h 138
2)清空字符串 PAGEREF _Toc11426 \h 138
3)字符串复制或赋值strcpy() PAGEREF _Toc25589 \h 138
4)字符串复制或赋值strncpy() PAGEREF _Toc29560 \h 139
5)获取字符串的长度strlen() PAGEREF _Toc5930 \h 139
6)字符串拼接strcat() PAGEREF _Toc7512 \h 139
7)字符串拼接strncat() PAGEREF _Toc16177 \h 139
8)字符串比较strcmp()和strncmp() PAGEREF _Toc25581 \h 140
9)查找字符strchr()和strrchr() PAGEREF _Toc8339 \h 140
10)查找字符串strstr() PAGEREF _Toc19709 \h 141
11)用于string的表达式 PAGEREF _Toc14299 \h 141
12)注意事项 PAGEREF _Toc8544 \h 141
e)在VS中,如果要使用C标准的字符串操作函数,要在源代码文件的最上面加 PAGEREF _Toc14123 \h 141
68、二维数组 PAGEREF _Toc19624 \h 142
1)创建二维数组 PAGEREF _Toc24003 \h 142
2)二维数组的使用 PAGEREF _Toc29488 \h 143
3)二维数组占用内存的情况 PAGEREF _Toc24669 \h 143
4)二维数组的初始化 PAGEREF _Toc14694 \h 143
5)清空二维数组 PAGEREF _Toc4557 \h 144
6)复制二维数组 PAGEREF _Toc20100 \h 144
int main() PAGEREF _Toc13642 \h 144
69、二维数组用于函数的参数 PAGEREF _Toc7716 \h 145
1)行指针(数组指针) PAGEREF _Toc28741 \h 146
2)二维数组名是行地址 PAGEREF _Toc26440 \h 146
3)把二维数组传递给函数 PAGEREF _Toc16318 \h 147
int main() PAGEREF _Toc11471 \h 147
70、结构体的基本概念 PAGEREF _Toc13683 \h 149
1)定义结构体描述 PAGEREF _Toc21106 \h 149
struct 结构体名 PAGEREF _Toc9058 \h 149
2)创建结构体变量 PAGEREF _Toc4793 \h 150
3)使用结构体 PAGEREF _Toc20591 \h 150
4)占用内存的大小 PAGEREF _Toc7562 \h 151
内存对齐:#pragma pack(字节数) PAGEREF _Toc26419 \h 151
5)清空结构体 PAGEREF _Toc27711 \h 151
6)复制结构体 PAGEREF _Toc6199 \h 151
#pragma pack(8) PAGEREF _Toc32617 \h 151
71、结构体指针 PAGEREF _Toc29490 \h 152
1)基本语法 PAGEREF _Toc7081 \h 152
2)用于函数的参数 PAGEREF _Toc22271 \h 153
3)用于动态分配内存 PAGEREF _Toc1601 \h 153
struct st_girl PAGEREF _Toc5725 \h 153
72、结构体数组 PAGEREF _Toc1873 \h 154
struct st_girl PAGEREF _Toc8136 \h 155
73、结构体嵌入数组和结构体 PAGEREF _Toc26333 \h 156
struct st_girl PAGEREF _Toc10463 \h 156
74、结构体中的指针 PAGEREF _Toc776 \h 158
struct string PAGEREF _Toc8756 \h 158
75、简单链表 PAGEREF _Toc20778 \h 160
struct st_girl PAGEREF _Toc7812 \h 160
76、共同体 PAGEREF _Toc26805 \h 162
union 共同体名 PAGEREF _Toc28825 \h 162
77、枚举 PAGEREF _Toc28151 \h 165
l 可以将整数强制转换成枚举量,语法:枚举类型(整数) PAGEREF _Toc7535 \h 166
78、引用的基本概念 PAGEREF _Toc9279 \h 166
int main() PAGEREF _Toc27732 \h 167
79、引用的本质 PAGEREF _Toc27129 \h 167
int main() PAGEREF _Toc27919 \h 168
80、引用用于函数的参数 PAGEREF _Toc13997 \h 169
int main() PAGEREF _Toc19552 \h 170
81、引用的形参和const PAGEREF _Toc12818 \h 172
int main() PAGEREF _Toc20815 \h 174
82、引用用于函数的返回值 PAGEREF _Toc29836 \h 174
int main() PAGEREF _Toc29223 \h 175
83、各种形参的使用场景 PAGEREF _Toc17618 \h 176
1)如果不需要在函数中修改实参 PAGEREF _Toc9741 \h 176
2)如果需要在函数中修改实参 PAGEREF _Toc913 \h 176
84、函数的默认参数 PAGEREF _Toc151 \h 176
int main() PAGEREF _Toc15679 \h 177
85、函数重载 PAGEREF _Toc20174 \h 177
int main() PAGEREF _Toc23424 \h 179
86、内联函数 PAGEREF _Toc27001 \h 179
int main() PAGEREF _Toc31441 \h 180
101、从结构体到类 PAGEREF _Toc20144 \h 181
102、类的访问权限 PAGEREF _Toc20044 \h 184
103、简单使用类 PAGEREF _Toc25854 \h 185
15)类的分文件编写。 PAGEREF _Toc2753 \h 185
104、构造函数和析构函数 PAGEREF _Toc7328 \h 186
1)构造函数 PAGEREF _Toc1947 \h 186
2)析构函数 PAGEREF _Toc13956 \h 186
7) 以下两行代码有本质的区别: PAGEREF _Toc1996 \h 187
9) 不建议在构造/析构函数中写太多的代码,可以调用成员函数。 PAGEREF _Toc21213 \h 187
11) C 11支持使用统一初始化列表。 PAGEREF _Toc27159 \h 187
void initdata() PAGEREF _Toc23442 \h 188
105、拷贝构造函数 PAGEREF _Toc16475 \h 189
106、初始化列表 PAGEREF _Toc2629 \h 193
4)如果成员是类,初始化列表对性能略有提升。 PAGEREF _Toc6115 \h 193
int main() PAGEREF _Toc28779 \h 195
107、const修饰成员函数 PAGEREF _Toc22620 \h 195
3)const成员函数不能调用非const成员函数。 PAGEREF _Toc10968 \h 195
1、为什么要保护类的成员变量不被修改? PAGEREF _Toc14249 \h 196
CGirl(const string &name, int age) PAGEREF _Toc23260 \h 196
108、this指针 PAGEREF _Toc20733 \h 197
109、静态成员 PAGEREF _Toc22876 \h 199
110、简单对象模型 PAGEREF _Toc8743 \h 200
111、友元 PAGEREF _Toc31614 \h 203
1)友元全局函数 PAGEREF _Toc2046 \h 203
2)友元类 PAGEREF _Toc15842 \h 204
3)友元成员函数 PAGEREF _Toc23358 \h 204
void func() PAGEREF _Toc4737 \h 205
112、运算符重载基础 PAGEREF _Toc6501 \h 207
2)重载函数参数列表中的顺序决定了操作数的位置。 PAGEREF _Toc11942 \h 208
l sizeof sizeof运算符 PAGEREF _Toc8518 \h 208
8)以下运算符只能通过成员函数进行重载: PAGEREF _Toc24999 \h 209
l -> 通过指针访问类成员的运算符 PAGEREF _Toc2418 \h 209
113、重载关系运算符 PAGEREF _Toc568 \h 211
114、重载左移运算符 PAGEREF _Toc1701 \h 212
115、重载下标运算符 PAGEREF _Toc12179 \h 213
116、重载赋值运算符 PAGEREF _Toc19157 \h 215
117、重载new&delete运算符 PAGEREF _Toc19673 \h 217
1)调用析构函数; PAGEREF _Toc18848 \h 217
int main() PAGEREF _Toc4164 \h 219
118、重载括号运算符 PAGEREF _Toc29983 \h 222
119、重载一元运算符 PAGEREF _Toc3368 \h 224
121、自动类型转换 PAGEREF _Toc24177 \h 225
1)一个类可以有多个转换函数。 PAGEREF _Toc5853 \h 226
3)CGirl(int)的隐式转换的场景: PAGEREF _Toc16247 \h 226
l 将int值传递给接受CGirl参数的函数时。 PAGEREF _Toc3070 \h 226
4)如果自动类型转换有二义性,编译将报错。 PAGEREF _Toc24473 \h 227
string m_name; // 姓名。 PAGEREF _Toc21671 \h 227
122、转换函数 PAGEREF _Toc5006 \h 228
123、继承的基本概念 PAGEREF _Toc29590 \h 229
124、继承方式 PAGEREF _Toc22647 \h 231
125、继承的对象模型 PAGEREF _Toc18776 \h 234
1)在PATH环境变量中增加cl.exe的目录 PAGEREF _Toc19669 \h 235
2)增加INCLUDE环境变量,内容如下: PAGEREF _Toc25073 \h 235
3)增加LIB环境变量,内容如下: PAGEREF _Toc7706 \h 235
class A { // 基类 PAGEREF _Toc10390 \h 235
126、如何构造基类 PAGEREF _Toc30701 \h 237
127、名字遮蔽与类作用域 PAGEREF _Toc31352 \h 239
128、继承的特殊关系 PAGEREF _Toc10836 \h 241
1)如果继承方式是公有的,派生类对象可以使用基类成员。 PAGEREF _Toc6327 \h 241
class A { // 基类 PAGEREF _Toc9822 \h 242
129、多继承与虚继承 PAGEREF _Toc15076 \h 243
131、多态的基本概念 PAGEREF _Toc11535 \h 245
2)在派生类中重定义虚函数时,函数特征要相同。 PAGEREF _Toc20171 \h 245
class CAllComers { // 报名者类 PAGEREF _Toc10893 \h 246
132、多态的应用场景 PAGEREF _Toc5979 \h 247
133、多态的对象模型 PAGEREF _Toc18404 \h 248
134、如何析构派生类 PAGEREF _Toc11228 \h 249
2)析构函数可以手工调用,如果对象中有堆内存,析构函数中以下代码是必要的: PAGEREF _Toc20456 \h 249
4)C 编译器对虚析构函数做了特别的处理。 PAGEREF _Toc8667 \h 250
7)友元函数不是类成员,不能继承。 PAGEREF _Toc10218 \h 250
class AA { // 基类 PAGEREF _Toc16244 \h 250
135、纯虚函数和抽象类 PAGEREF _Toc25444 \h 251
136、运行阶段类型识别dynamic_cast PAGEREF _Toc16604 \h 252
1)dynamic_cast只适用于包含虚函数的类。 PAGEREF _Toc29132 \h 253
int attack; // 攻击伤害。 PAGEREF _Toc21344 \h 253
137、typeid运算符和type_info类 PAGEREF _Toc8233 \h 255
140、自动推导类型auto PAGEREF _Toc14641 \h 257
1)auto声明的变量必须在定义时初始化。 PAGEREF _Toc13343 \h 257
不要滥用auto,auto在编程时真正的用途如下: PAGEREF _Toc25780 \h 257
141、函数模板的基本概念 PAGEREF _Toc21643 \h 258
142、函数模板的注意事项 PAGEREF _Toc3888 \h 259
1)可以为类的成员函数创建模板,但不能是虚函数和析构函数。 PAGEREF _Toc21490 \h 259
3)使用函数模板时,推导的数据类型必须适应函数模板中的代码。 PAGEREF _Toc11791 \h 259
144、函数模板的具体化 PAGEREF _Toc21309 \h 259
145、函数模板分文件编写 PAGEREF _Toc786 \h 262
146、函数模板高级 PAGEREF _Toc10150 \h 264
1)decltype关键字 PAGEREF _Toc10016 \h 264
decltype推导规则(按步骤): PAGEREF _Toc1217 \h 264
2)函数后置返回类型 PAGEREF _Toc11421 \h 264
auto func(int x,double y) -> int; PAGEREF _Toc13312 \h 264
3)C 14的auto关键字 PAGEREF _Toc7529 \h 265
auto func(T1 x, T2 y) -> decltype(x y) PAGEREF _Toc11555 \h 265
150、模板类的基本概念 PAGEREF _Toc31232 \h 266
151、模板类的示例-栈 PAGEREF _Toc16252 \h 267
152、模板类的示例-数组 PAGEREF _Toc19011 \h 269
153、嵌套和递归使用模板类 PAGEREF _Toc14823 \h 271
154、模板类具体化 PAGEREF _Toc5630 \h 275
156、模板类与继承 PAGEREF _Toc12260 \h 277
1)模板类继承普通类 PAGEREF _Toc2595 \h 277
int m_a; PAGEREF _Toc11328 \h 277
2)普通类继承模板类的实例化版本 PAGEREF _Toc31054 \h 278
int m_a; PAGEREF _Toc26146 \h 278
3)普通类继承模板类。 PAGEREF _Toc6427 \h 279
int m_a; PAGEREF _Toc29571 \h 279
4)模板类继承模板类。 PAGEREF _Toc11074 \h 279
int m_a; PAGEREF _Toc3155 \h 280
5)模板类继承模板参数给出的基类 PAGEREF _Toc30884 \h 281
int main() PAGEREF _Toc19418 \h 282
157、模板类与函数 PAGEREF _Toc2588 \h 282
158、模板类与友元 PAGEREF _Toc25242 \h 283
1)非模板友元示例: PAGEREF _Toc30013 \h 284
class AA PAGEREF _Toc4078 \h 284
2)约束模板友元示例: PAGEREF _Toc4929 \h 285
void show(T& a) PAGEREF _Toc28040 \h 286
3)非约束模板友元 PAGEREF _Toc22174 \h 287
class AA PAGEREF _Toc1417 \h 287
159、成员模板类 PAGEREF _Toc1139 \h 288
160、将模板类用作参数 PAGEREF _Toc17958 \h 289
165、编译预处理 PAGEREF _Toc24932 \h 291
1)包含头文件 PAGEREF _Toc23446 \h 291
2)宏定义指令 PAGEREF _Toc618 \h 292
无参数的宏:#define 宏名 宏内容 PAGEREF _Toc8736 \h 292
3)条件编译 PAGEREF _Toc18715 \h 292
#ifdef 宏名 PAGEREF _Toc14786 \h 292
4)解决头文件中代码重复包含的问题 PAGEREF _Toc3892 \h 293
第一种:用#ifndef指令。 PAGEREF _Toc20505 \h 293
第二种:把#pragma once指令放在文件的开头。 PAGEREF _Toc25450 \h 293
166、编译和链接 PAGEREF _Toc6760 \h 293
一、源代码的组织 PAGEREF _Toc2509 \h 293
二、编译预处理 PAGEREF _Toc2288 \h 294
1)处理#include头文件包含指令。 PAGEREF _Toc17477 \h 294
五、更多细节 PAGEREF _Toc26178 \h 294
4)如果函数和类的定义不存在,编译不会报错,但链接会出现无法解析的外部命令。 PAGEREF _Toc27235 \h 295
12)Linux下C 编译和链接的原理与VS一样。 PAGEREF _Toc7586 \h 295
167、命名空间 PAGEREF _Toc23083 \h 295
二、使用命名空间 PAGEREF _Toc4083 \h 296
1)运算符:: PAGEREF _Toc31017 \h 296
语法:命名空间::名字 PAGEREF _Toc23097 \h 296
2)using声明 PAGEREF _Toc1122 \h 296
语法:using 命名空间::名字 PAGEREF _Toc29579 \h 296
3)using编译指令 PAGEREF _Toc7191 \h 296
语法:using namespace命名空间 PAGEREF _Toc17293 \h 296
四、注意事项 PAGEREF _Toc8267 \h 296
6)匿名的命名空间,从创建的位置到文件结束有效。 PAGEREF _Toc11617 \h 297
#include <iostream> // 包含头文件。 PAGEREF _Toc1564 \h 297
一、static_cast PAGEREF _Toc32298 \h 300
1)用于基本内置数据类型之间的转换 PAGEREF _Toc18607 \h 300
C风格:编译器可能会提示警告信息。 PAGEREF _Toc25789 \h 300
2)用于指针之间的转换 PAGEREF _Toc8878 \h 300
C风格:可用于各种类型指针之间的转换。 PAGEREF _Toc25531 \h 300
3)不能转换掉expression的const或volitale属性 PAGEREF _Toc23651 \h 301
int main(int argc, char* argv[]) PAGEREF _Toc31150 \h 301
169、C 类型转换-static_cast PAGEREF _Toc7156 \h 301
一、static_cast PAGEREF _Toc22240 \h 302
1)用于内置数据类型之间的转换 PAGEREF _Toc20565 \h 302
int main(int argc, char* argv[]) PAGEREF _Toc30461 \h 302
2)用于指针之间的转换 PAGEREF _Toc21731 \h 303
C风格可以把不同类型的指针进行转换。 PAGEREF _Toc25798 \h 303
二、const_cast PAGEREF _Toc6860 \h 303
三、reinterpret_cast PAGEREF _Toc24671 \h 304
181、string容器 PAGEREF _Toc20135 \h 305
一、构造和析构 PAGEREF _Toc9466 \h 305
二、特性操作 PAGEREF _Toc25584 \h 311
三、字符操作 PAGEREF _Toc12526 \h 311
四、赋值操作 PAGEREF _Toc32068 \h 312
五、连接操作 PAGEREF _Toc19327 \h 312
六、交换操作 PAGEREF _Toc8076 \h 313
七、截取操作 PAGEREF _Toc7642 \h 313
八、比较操作 PAGEREF _Toc20349 \h 313
九、查找操作 PAGEREF _Toc8478 \h 313
十、替换操作 PAGEREF _Toc29715 \h 315
十一、插入操作 PAGEREF _Toc29020 \h 315
十二、删除操作 PAGEREF _Toc28149 \h 316
182、vector容器 PAGEREF _Toc22013 \h 316
一、构造函数 PAGEREF _Toc4833 \h 317
二、特性操作 PAGEREF _Toc4588 \h 317
三、元素操作 PAGEREF _Toc30100 \h 318
四、赋值操作 PAGEREF _Toc25203 \h 318
五、交换操作 PAGEREF _Toc26052 \h 319
六、比较操作 PAGEREF _Toc2484 \h 319
七、插入和删除 PAGEREF _Toc12588 \h 319
八、vector的嵌套 PAGEREF _Toc27163 \h 321
九、注意事项 PAGEREF _Toc13755 \h 322
1)迭代器失效的问题 PAGEREF _Toc8772 \h 322
183、迭代器 PAGEREF _Toc5724 \h 322
1)正向迭代器 PAGEREF _Toc21799 \h 322
2)双向迭代器 PAGEREF _Toc12029 \h 323
const_reverse_iterator crend(); PAGEREF _Toc26759 \h 323
3)随机访问迭代器 PAGEREF _Toc2485 \h 323
4)输入和输出迭代器 PAGEREF _Toc5111 \h 324
int item; PAGEREF _Toc26173 \h 324
184、基于范围的for循环 PAGEREF _Toc11510 \h 325
2)数组名传入函数后,已退化成指针,不能作为容器名。 PAGEREF _Toc11804 \h 326
4)注意迭代器失效的问题。 PAGEREF _Toc16619 \h 326
class AA PAGEREF _Toc17197 \h 326
185、list容器 PAGEREF _Toc21515 \h 327
一、 构造函数 PAGEREF _Toc17263 \h 328
1)list(); // 创建一个空的list容器。 PAGEREF _Toc5237 \h 328
3)list(const list<T>& l); // 拷贝构造函数。 PAGEREF _Toc29761 \h 328
int main() PAGEREF _Toc2809 \h 328
二、 特性操作 PAGEREF _Toc22636 \h 330
三、元素操作 PAGEREF _Toc24434 \h 330
四、赋值操作 PAGEREF _Toc20405 \h 330
五、交换、反转、排序、归并 PAGEREF _Toc13466 \h 331
六、比较操作 PAGEREF _Toc21454 \h 332
七、插入和删除 PAGEREF _Toc32698 \h 332
八、list容器的简单实现 PAGEREF _Toc17873 \h 334
185、pair键值对 PAGEREF _Toc8873 \h 340
186、map容器 PAGEREF _Toc6328 \h 343
1)map(); // 创建一个空的map容器。 PAGEREF _Toc18540 \h 344
int main() PAGEREF _Toc28465 \h 344
二、特性操作 PAGEREF _Toc19031 \h 345
三、元素操作 PAGEREF _Toc27569 \h 345
四、赋值操作 PAGEREF _Toc19375 \h 346
五、交换操作 PAGEREF _Toc29380 \h 346
六、比较操作 PAGEREF _Toc19634 \h 346
七、查找操作 PAGEREF _Toc17435 \h 347
1)查找键值为key的键值对 PAGEREF _Toc20466 \h 347
2)查找键值>=key的键值对 PAGEREF _Toc4391 \h 347
3)查找键>key的键值对 PAGEREF _Toc11913 \h 347
4)统计键值对的个数 PAGEREF _Toc17869 \h 347
size_t count(const K &key) const; PAGEREF _Toc14962 \h 347
八、插入和删除 PAGEREF _Toc21282 \h 348
187、unordered_map容器 PAGEREF _Toc29545 \h 351
一、构造函数 PAGEREF _Toc10497 \h 352
1)umap(); // 创建一个空的umap容器。 PAGEREF _Toc1186 \h 352
int main() PAGEREF _Toc32109 \h 353
二、特性操作 PAGEREF _Toc11573 \h 353
三、元素操作 PAGEREF _Toc22486 \h 354
四、赋值操作 PAGEREF _Toc20663 \h 355
五、交换操作 PAGEREF _Toc18365 \h 355
六、比较操作 PAGEREF _Toc6621 \h 356
七、查找操作 PAGEREF _Toc10577 \h 356
1)查找键值为key的键值对 PAGEREF _Toc10028 \h 356
2)统计键值对的个数 PAGEREF _Toc12267 \h 356
size_t count(const K &key) const; PAGEREF _Toc14827 \h 356
八、插入和删除 PAGEREF _Toc28067 \h 356
188、queue容器 PAGEREF _Toc25086 \h 359
一、构造函数 PAGEREF _Toc2130 \h 359
1)queue(); // 创建一个空的队列。 PAGEREF _Toc13657 \h 359
二、常用操作 PAGEREF _Toc4015 \h 360
三、其它操作 PAGEREF _Toc22556 \h 361
2)void swap(queue<T> &q); // 交换。 PAGEREF _Toc17785 \h 361
189、STL其它容器 PAGEREF _Toc678 \h 362
一、array(静态数组) PAGEREF _Toc28615 \h 362
1)物理结构 PAGEREF _Toc23833 \h 362
T elems_[size]; PAGEREF _Toc20210 \h 362
4)各种操作 PAGEREF _Toc26917 \h 362
4)T &operator[](size_t n); PAGEREF _Toc22401 \h 362
6)T &at(size_t n); PAGEREF _Toc4004 \h 362
////void func(int arr[][6],int len) PAGEREF _Toc18436 \h 363
二、deque(双端队列) PAGEREF _Toc32059 \h 365
l 随机访问的效率比vector容器略低。 PAGEREF _Toc6044 \h 366
4)各种操作 PAGEREF _Toc19588 \h 366
三、forward_list(单链表) PAGEREF _Toc20968 \h 366
1)物理结构 PAGEREF _Toc13779 \h 366
2)迭代器 PAGEREF _Toc19579 \h 366
4)各种操作 PAGEREF _Toc22793 \h 366
四、multimap PAGEREF _Toc1773 \h 366
五、set&multiset PAGEREF _Toc22266 \h 367
六、unordered_multimap PAGEREF _Toc30868 \h 367
七、unordered_set&unordered_multiset PAGEREF _Toc16825 \h 367
八、priority_queue(优先队列) PAGEREF _Toc29408 \h 367
九、stack(栈) PAGEREF _Toc13909 \h 368
191、STL算法 PAGEREF _Toc12584 \h 368
一、函数对象 PAGEREF _Toc21318 \h 368
二、预定义的函数对象 PAGEREF _Toc20117 \h 368
三、算法函数 PAGEREF _Toc11101 \h 369
STL将算法函数分成四组: PAGEREF _Toc3544 \h 369
3)排序和相关操作:包括多个排序函数和其它各种函数,如集合操作。 PAGEREF _Toc3361 \h 369
四、学习要领 PAGEREF _Toc10123 \h 372
五、常用函数 PAGEREF _Toc10793 \h 372
6)二分查找 PAGEREF _Toc7342 \h 373
cout << "亲爱的" << no << "号:我是一只傻傻鸟。\n"; PAGEREF _Toc17970 \h 375
193、智能指针unique_ptr PAGEREF _Toc13783 \h 381
一、基本用法 PAGEREF _Toc5128 \h 382
1)初始化 PAGEREF _Toc23819 \h 382
AA* p = new AA("西施"); PAGEREF _Toc22127 \h 382
2)使用方法 PAGEREF _Toc12137 \h 382
AA* p = new AA("西施"); PAGEREF _Toc19897 \h 382
3)用于函数的参数 PAGEREF _Toc19713 \h 383
4)不支持指针的运算( 、-、 、--) PAGEREF _Toc32429 \h 383
二、更多技巧 PAGEREF _Toc24720 \h 383
5)reset()释放对象。 PAGEREF _Toc1503 \h 383
pp.reset(); // 释放pp对象指向的资源对象。 PAGEREF _Toc26109 \h 383
6)swap()交换两个unique_ptr的控制权。 PAGEREF _Toc694 \h 383
9)unique_ptr提供了支持数组的具体化版本。 PAGEREF _Toc11713 \h 384
class AA PAGEREF _Toc16303 \h 384
194、智能指针shared_ptr PAGEREF _Toc19625 \h 386
一、基本用法 PAGEREF _Toc10651 \h 387
1)初始化 PAGEREF _Toc25236 \h 387
AA* p = new AA("西施"); PAGEREF _Toc30188 \h 387
2)使用方法 PAGEREF _Toc14352 \h 387
3)用于函数的参数 PAGEREF _Toc6220 \h 387
4)不支持指针的运算( 、-、 、--) PAGEREF _Toc29199 \h 388
二、更多细节 PAGEREF _Toc27157 \h 388
5)reset()改变与资源的关联关系。 PAGEREF _Toc21508 \h 388
6)swap()交换两个shared_ptr的控制权。 PAGEREF _Toc14949 \h 388
9)shared_ptr提供了支持数组的具体化版本。 PAGEREF _Toc3111 \h 388
10)shared_ptr的线程安全性: PAGEREF _Toc29661 \h 388
class AA PAGEREF _Toc8892 \h 389
195、智能指针的删除器 PAGEREF _Toc11595 \h 390
196、智能指针weak_ptr PAGEREF _Toc11396 \h 391
一、shared_ptr存在的问题 PAGEREF _Toc25819 \h 391
二、weak_ptr是什么 PAGEREF _Toc8642 \h 392
三、如何使用weak_ptr PAGEREF _Toc24952 \h 394
weak_ptr没有重载 ->和 *操作符,不能直接访问资源。 PAGEREF _Toc1669 \h 394
2)expired(); // 判断它指资源是否已过期(已经被销毁)。 PAGEREF _Toc21635 \h 394
class AA PAGEREF _Toc13837 \h 394
201、文件操作-写入文本文件 PAGEREF _Toc26131 \h 396
202、文件操作-读取文本文件 PAGEREF _Toc29316 \h 397
203、文件操作-写入二进制文件 PAGEREF _Toc26709 \h 399
204、文件操作-读取二进制文件 PAGEREF _Toc9065 \h 402
205、文件操作-随机存取 PAGEREF _Toc4804 \h 404
一、fstream类 PAGEREF _Toc4896 \h 404
2)在Linux平台下,文件的写和读有严格的权限控制。(需要的权限越少越好) PAGEREF _Toc966 \h 404
二、文件的位置指针 PAGEREF _Toc4902 \h 404
1)获取文件位置指针 PAGEREF _Toc20410 \h 404
2)移动文件位置指针 PAGEREF _Toc28115 \h 404
三、随机存取 PAGEREF _Toc7230 \h 405
一、写文件 PAGEREF _Toc10827 \h 406
206、文件操作-缓冲区及流状态 PAGEREF _Toc23018 \h 407
一、文件缓冲区 PAGEREF _Toc3241 \h 407
1)flush()成员函数 PAGEREF _Toc715 \h 407
2)endl PAGEREF _Toc15288 \h 407
3)unitbuf PAGEREF _Toc11174 \h 407
4)nounitbuf PAGEREF _Toc1452 \h 407
二、流状态 PAGEREF _Toc19550 \h 408
1)eofbit PAGEREF _Toc17260 \h 408
当输入流操作到达文件未尾时,将设置eofbit。 PAGEREF _Toc24706 \h 408
2)badbit PAGEREF _Toc5999 \h 408
3)failbit PAGEREF _Toc18764 \h 408
fail()成员函数检查流是否设置了failbit。 PAGEREF _Toc27705 \h 408
209、C 异常 PAGEREF _Toc25752 \h 410
一、异常的语法 PAGEREF _Toc30708 \h 410
1)捕获全部的异常 PAGEREF _Toc10401 \h 410
2)捕获指定的异常 PAGEREF _Toc21118 \h 410
二、栈解旋 PAGEREF _Toc26040 \h 412
三、异常规范 PAGEREF _Toc15325 \h 412
四、C 标准库异常 PAGEREF _Toc28021 \h 413
五、重点关注的异常 PAGEREF _Toc17027 \h 413
1)std::bad_alloc PAGEREF _Toc13320 \h 413
int main() PAGEREF _Toc17116 \h 413
2)std::bad_cast PAGEREF _Toc3043 \h 414
3)std::bad_typeid PAGEREF _Toc12596 \h 414
六、逻辑错误异常 PAGEREF _Toc23873 \h 414
1)std::out_of_range PAGEREF _Toc28045 \h 414
2)std::length_error PAGEREF _Toc1540 \h 414
3)std::domain_error PAGEREF _Toc3200 \h 415
4)std::invalid_argument PAGEREF _Toc17816 \h 415
using namespace std; PAGEREF _Toc16412 \h 415
七、其它异常 PAGEREF _Toc31964 \h 416
1)std::range_error PAGEREF _Toc10405 \h 416
2)std::overflow_error PAGEREF _Toc2654 \h 417
3)std::underflow_error PAGEREF _Toc21604 \h 417
4)ios_base::failure PAGEREF _Toc3440 \h 418
int main() PAGEREF _Toc12008 \h 418
5)std::bad_exception PAGEREF _Toc28376 \h 418
210、C 断言 PAGEREF _Toc25452 \h 419
二、C 11静态断言 PAGEREF _Toc4920 \h 420
220、C 11新标准 PAGEREF _Toc2891 \h 420
一、long long类型 PAGEREF _Toc2098 \h 420
二、char16_t和char32_t类型 PAGEREF _Toc25801 \h 421
三、原始字面量 PAGEREF _Toc3342 \h 421
四、统一的初始化(列表) PAGEREF _Toc29270 \h 421
五、自动推导类型auto PAGEREF _Toc8104 \h 422
六、decltype关键字 PAGEREF _Toc23009 \h 422
七、函数后置返回类型 PAGEREF _Toc6039 \h 423
八、模板的别名 PAGEREF _Toc16516 \h 423
九、空指针nullptr PAGEREF _Toc27133 \h 423
十、智能指针 PAGEREF _Toc15637 \h 424
十一、异常规范方面的修改 PAGEREF _Toc18978 \h 424
十二、强类型枚举(枚举类) PAGEREF _Toc20765 \h 424
十三、explicit关键字 PAGEREF _Toc18805 \h 424
十四、类内成员初始化 PAGEREF _Toc12675 \h 425
十五、基于范围的for循环 PAGEREF _Toc23374 \h 425
十六、新的STL容器 PAGEREF _Toc30843 \h 425
1)array(静态数组) PAGEREF _Toc20469 \h 425
2)forward_list(单向链表) PAGEREF _Toc119 \h 425
十七、新的STL方法(成员函数) PAGEREF _Toc15953 \h 425
十八、摒弃export PAGEREF _Toc31246 \h 426
十九、嵌套模板的尖括号 PAGEREF _Toc31914 \h 426
二十、final关键字 PAGEREF _Toc21069 \h 426
二十一、override关键字 PAGEREF _Toc31791 \h 427
二十二、数值类型和字符串之间的转换 PAGEREF _Toc29849 \h 428
1、数值转换为字符串 PAGEREF _Toc1499 \h 428
string to_string (int val); PAGEREF _Toc3202 \h 428
2、字符转换为串数值 PAGEREF _Toc2940 \h 428
二十三、静态断言static_assert PAGEREF _Toc20272 \h 429
二十四、常量表达式constexpr关键字 PAGEREF _Toc5599 \h 429
const关键字从功能上来说有双重语义:只读变量和修饰常量。 PAGEREF _Toc20830 \h 429
二十五、默认函数控制=default与=delete PAGEREF _Toc24944 \h 430
在C 中自定义的类,编译器会默认生成一些成员函数: PAGEREF _Toc22008 \h 430
221、委托构造和继承构造 PAGEREF _Toc1236 \h 431
一、委托构造 PAGEREF _Toc8918 \h 431
class AA PAGEREF _Toc6462 \h 432
二、继承构造 PAGEREF _Toc5166 \h 433
// 有一个参数的构造函数,初始化m_a PAGEREF _Toc23188 \h 433
222、lambda函数 PAGEREF _Toc11440 \h 434
一、参数列表 PAGEREF _Toc9634 \h 435
l lambda函数不能有默认参数。 PAGEREF _Toc3947 \h 435
二、返回类型 PAGEREF _Toc11493 \h 436
三、函数体 PAGEREF _Toc31208 \h 436
四、捕获列表 PAGEREF _Toc16569 \h 436
1)值捕获 PAGEREF _Toc18470 \h 437
2)引用捕获 PAGEREF _Toc11760 \h 437
3)隐式捕获 PAGEREF _Toc6483 \h 438
4)混合方式捕获 PAGEREF _Toc3606 \h 438
5)修改值捕获变量的值 PAGEREF _Toc9082 \h 438
6)异常说明 PAGEREF _Toc32501 \h 439
五、lambda函数的本质 PAGEREF _Toc30082 \h 439
1)采用值捕获 PAGEREF _Toc8978 \h 439
2)采用引用捕获 PAGEREF _Toc8745 \h 440
如果lambda函数采用引用捕获的方式,编译器直接引用就行了。 PAGEREF _Toc6972 \h 440
225、右值引用 PAGEREF _Toc25577 \h 440
一、左值、右值 PAGEREF _Toc26979 \h 440
C 11扩展了右值的概念,将右值分为了纯右值和将亡值。 PAGEREF _Toc2274 \h 440
二、左值引用、右值引用 PAGEREF _Toc28495 \h 441
AA getTemp() PAGEREF _Toc12096 \h 441
226、移动语义 PAGEREF _Toc4081 \h 443
3)C 11中的所有容器都实现了移动语义,避免对含有资源的对象发生无谓的拷贝。 PAGEREF _Toc23999 \h 444
class AA PAGEREF _Toc28774 \h 444
227、完美转发 PAGEREF _Toc8490 \h 446
228、可变参数模板 PAGEREF _Toc32229 \h 447
229、时间操作chrono库 PAGEREF _Toc24338 \h 448
一、时间长度 PAGEREF _Toc18467 \h 449
class duration PAGEREF _Toc20245 \h 449
二、系统时间 PAGEREF _Toc31746 \h 450
system_clock类支持了对系统时钟的访问,提供了三个静态成员函数: PAGEREF _Toc22369 \h 450
三、计时器 PAGEREF _Toc26751 \h 452
int main() PAGEREF _Toc11873 \h 452
240、C 11线程 PAGEREF _Toc2104 \h 453
一、创建线程 PAGEREF _Toc29359 \h 453
线程类:std::thread PAGEREF _Toc7173 \h 453
1)thread() noexcept; PAGEREF _Toc13252 \h 453
3)thread(const thread& ) = delete; PAGEREF _Toc1910 \h 453
4)thread(thread&& other ) noexcept; PAGEREF _Toc30973 \h 453
for (int ii = 1; ii <= 10; ii ) PAGEREF _Toc26174 \h 454
二、线程资源的回收 PAGEREF _Toc493 \h 456
用joinable()成员函数可以判断子线程的分离状态,函数返回布尔类型。 PAGEREF _Toc18881 \h 457
三、this_thread的全局函数 PAGEREF _Toc4625 \h 458
1)get_id() PAGEREF _Toc27495 \h 458
4)yield() PAGEREF _Toc5251 \h 458
5)thread类其它的成员函数 PAGEREF _Toc30326 \h 458
for (int ii = 1; ii <= 3; ii ) PAGEREF _Toc15994 \h 459
四、call_once函数 PAGEREF _Toc19393 \h 460
for (int ii = 1; ii <= 3; ii ) PAGEREF _Toc10021 \h 460
五、native_handle函数 PAGEREF _Toc12740 \h 461
for (int ii=1;ii<=10;ii ) PAGEREF _Toc2100 \h 461
六、线程安全 PAGEREF _Toc31724 \h 462
int aa = 0; // 定义全局变量。 PAGEREF _Toc28127 \h 462
242、互斥锁 PAGEREF _Toc23074 \h 463
一、mutex类 PAGEREF _Toc4788 \h 463
1)加锁lock() PAGEREF _Toc26084 \h 463
2)解锁unlock() PAGEREF _Toc22223 \h 463
3)尝试加锁try_lock() PAGEREF _Toc24840 \h 463
mutex mtx; // 创建互斥锁,保护共享资源cout对象。 PAGEREF _Toc5660 \h 464
二、timed_mutex类 PAGEREF _Toc31634 \h 465
三、recursive_mutex类 PAGEREF _Toc32073 \h 465
递归互斥锁允许同一线程多次获得互斥锁,可以解决同一线程多次加锁造成的死锁问题。 PAGEREF _Toc24906 \h 465
四、lock_guard类 PAGEREF _Toc15243 \h 466
lock_guard的定义如下: PAGEREF _Toc5362 \h 466
243、条件变量-生产消费者模型 PAGEREF _Toc8047 \h 466
一、condition_variable类 PAGEREF _Toc3666 \h 467
1)condition_variable() 默认构造函数。 PAGEREF _Toc24393 \h 467
8)wait_for(unique_lock<mutex> lock,时间长度) PAGEREF _Toc31089 \h 467
二、unique_lock类 PAGEREF _Toc4609 \h 467
class AA PAGEREF _Toc10412 \h 468
244、原子类型atomic PAGEREF _Toc17221 \h 471
250、可调用对象 PAGEREF _Toc6297 \h 474
一、普通函数 PAGEREF _Toc9846 \h 474
Fun show; // 声明普通函数。 PAGEREF _Toc7113 \h 475
二、类的静态成员函数 PAGEREF _Toc17858 \h 475
类的静态成员函数和普通函数本质上是一样的,把普通函数放在类中而已。 PAGEREF _Toc13807 \h 475
三、仿函数 PAGEREF _Toc14155 \h 476
int main() PAGEREF _Toc10492 \h 477
四、lambda函数 PAGEREF _Toc28749 \h 477
int main() PAGEREF _Toc3100 \h 477
五、类的非静态成员函数 PAGEREF _Toc20123 \h 477
int main() PAGEREF _Toc17353 \h 478
六、可被转换为函数指针的类对象 PAGEREF _Toc29426 \h 478
// 定义函数 PAGEREF _Toc11084 \h 479
return show; // 返回普通函数。 PAGEREF _Toc6896 \h 479
int main() PAGEREF _Toc863 \h 479
DD dd; PAGEREF _Toc24495 \h 479
251、包装器function PAGEREF _Toc5844 \h 479
class function…… PAGEREF _Toc9817 \h 479
l 重载了bool运算符,用于判断是否包装了可调用对象。 PAGEREF _Toc19811 \h 480
// 普通函数 PAGEREF _Toc14889 \h 480
struct DD // 可以被转换为普通函数指针的类。 PAGEREF _Toc26135 \h 480
return show; // 返回普通函数show的地址。 PAGEREF _Toc956 \h 481
int main() PAGEREF _Toc7663 \h 481
// 普通函数。 PAGEREF _Toc12190 \h 481
// 类的静态成员函数。 PAGEREF _Toc27818 \h 481
// 仿函数。 PAGEREF _Toc26222 \h 481
BB bb; PAGEREF _Toc4315 \h 481
// 创建lambda对象。 PAGEREF _Toc2843 \h 481
// 类的非静态成员函数。 PAGEREF _Toc11702 \h 482
DD dd; PAGEREF _Toc22529 \h 482
if (fx) fx(6, "我是一只傻傻鸟。"); PAGEREF _Toc4155 \h 482
252、适配器bind PAGEREF _Toc14831 \h 482
std::bind()的本质是仿函数。 PAGEREF _Toc7838 \h 483
int main() PAGEREF _Toc19496 \h 483
fn2(1, "我是一只傻傻鸟。"); PAGEREF _Toc29791 \h 483
fn5(1, "我是一只傻傻鸟。", 88); PAGEREF _Toc31970 \h 483
示例二(绑定六种可调用对象): PAGEREF _Toc13330 \h 484
// 普通函数 PAGEREF _Toc24516 \h 484
struct DD // 可以被转换为普通函数指针的类。 PAGEREF _Toc24219 \h 484
return show; // 返回普通函数show的地址。 PAGEREF _Toc15172 \h 484
int main() PAGEREF _Toc15597 \h 485
// 普通函数。 PAGEREF _Toc18296 \h 485
// 类的静态成员函数。 PAGEREF _Toc13809 \h 485
// 仿函数。 PAGEREF _Toc18985 \h 485
// 创建lambda对象。 PAGEREF _Toc4298 \h 485
// 类的非静态成员函数。 PAGEREF _Toc24129 \h 485
DD dd; PAGEREF _Toc16193 \h 486
253、可变函数和参数 PAGEREF _Toc27304 \h 486
#include <functional> PAGEREF _Toc18858 \h 486
cout << "亲爱的,我是一只傻傻鸟。\n"; PAGEREF _Toc25521 \h 486
cout << "亲爱的," << message << endl; PAGEREF _Toc8298 \h 486
cout << "表白完成。\n"; PAGEREF _Toc31235 \h 487
return f; PAGEREF _Toc27994 \h 487
int main() PAGEREF _Toc17569 \h 487
show(show1,"我是一只傻傻鸟。"); PAGEREF _Toc21970 \h 487
//thread t2(show1,"我是一只傻傻鸟。"); PAGEREF _Toc7262 \h 487
254、回调函数的实现 PAGEREF _Toc23762 \h 487
struct BB { // 处理业务的类 PAGEREF _Toc6114 \h 488
class AA PAGEREF _Toc1884 \h 488
// 注册回调函数,回调函数只有一个参数(消费者接收到的数据)。 PAGEREF _Toc21791 \h 488
for (int ii = 0; ii < num; ii ) PAGEREF _Toc23728 \h 488
void outcache() { // 消费者线程任务函数。 PAGEREF _Toc25378 \h 489
// 处理出队的数据(把数据消费掉)。 PAGEREF _Toc26950 \h 489
int main() PAGEREF _Toc30623 \h 489
aa.incache(2); // 生产2个数据。 PAGEREF _Toc25272 \h 489
aa.incache(5); // 生产5个数据。 PAGEREF _Toc13739 \h 490
t1.join(); // 回收子线程的资源。 PAGEREF _Toc15368 \h 490
t2.join(); PAGEREF _Toc14210 \h 490
t3.join(); PAGEREF _Toc13524 \h 490
255、如何取代虚函数 PAGEREF _Toc895 \h 490
#include <iostream> // 包含头文件。 PAGEREF _Toc4932 \h 490
struct Hero { // 英雄基类 PAGEREF _Toc31065 \h 490
// 注册子类成员函数,子类成员函数没有参数。 PAGEREF _Toc15257 \h 490
struct XS :public Hero { // 西施派生类 PAGEREF _Toc14666 \h 490
struct HX :public Hero { // 韩信派生类 PAGEREF _Toc19733 \h 491
int main() PAGEREF _Toc7308 \h 491
// 根据用户选择的英雄,施展技能。 PAGEREF _Toc14673 \h 491
int id = 0; // 英雄的id。 PAGEREF _Toc32373 \h 491
cout << "请输入英雄(1-西施;2-韩信。):"; PAGEREF _Toc26087 \h 491
Hero* ptr = nullptr; PAGEREF _Toc12133 \h 491
if (id == 1) { // 1-西施 PAGEREF _Toc9756 \h 491
ptr = new XS; PAGEREF _Toc4180 \h 491
else if (id == 2) { // 2-韩信 PAGEREF _Toc20165 \h 491
ptr = new HX; PAGEREF _Toc9107 \h 491
ptr->show(); // 调用子类的成员函数。 PAGEREF _Toc7805 \h 491
delete ptr; // 释放派生类对象。 PAGEREF _Toc1202 \h 491
标签:
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论