在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++语言基础 → C++基础课件和源代码

C++基础课件和源代码

C/C++语言基础

下载此实例
  • 开发语言:C/C++
  • 实例大小:7.49M
  • 下载次数:17
  • 浏览次数:118
  • 发布时间:2022-11-26
  • 实例类别:C/C++语言基础
  • 发 布 人:tangyq
  • 文件格式:.docx
  • 所需积分:2
 相关标签:

实例介绍

【实例简介】C 基础课件和源代码

C 比较详细的手册

【实例截图】

from clipboardfrom clipboardfrom clipboardfrom clipboardfrom clipboardfrom clipboardfrom clipboard

【核心代码】



1Windows开发环境的准备  PAGEREF _Toc4803 \h 34

1)下载Visual Studio 2022安装文件  PAGEREF _Toc16912 \h 34

2)安装Visual Studio 2022  PAGEREF _Toc20157 \h 35

2Linux开发环境  PAGEREF _Toc28524 \h 36

3、第一个C 程序  PAGEREF _Toc13801 \h 37

1)用VS生成最简单的C 程序  PAGEREF _Toc12996 \h 37

2)运行C 程序  PAGEREF _Toc11628 \h 39

3)示例  PAGEREF _Toc828 \h 39

4C 输出数据  PAGEREF _Toc9250 \h 40

1)数据的分类  PAGEREF _Toc16224 \h 40

2)输出数据  PAGEREF _Toc1279 \h 40

3)示例  PAGEREF _Toc31370 \h 40

5、程序的注释  PAGEREF _Toc24933 \h 41

1单行注释  PAGEREF _Toc18003 \h 41

2)多行注释  PAGEREF _Toc15166 \h 41

3注释注释  PAGEREF _Toc24780 \h 41

4VS中的快捷键  PAGEREF _Toc21729 \h 42

5)示例  PAGEREF _Toc13656 \h 42

/*  PAGEREF _Toc23807 \h 42

6、使用变量  PAGEREF _Toc19794 \h 43

1)声明变量  PAGEREF _Toc16181 \h 43

2)变量的赋值  PAGEREF _Toc30438 \h 43

3)示例  PAGEREF _Toc26103 \h 43

7、使用常量  PAGEREF _Toc23500 \h 44

1)宏常量  PAGEREF _Toc24803 \h 44

2const修饰的变量  PAGEREF _Toc20167 \h 44

3)常量的特点  PAGEREF _Toc15055 \h 45

4)示例  PAGEREF _Toc3597 \h 45

8、标识符的命名  PAGEREF _Toc25858 \h 45

1C 命名规则  PAGEREF _Toc27142 \h 45

2C 关键字  PAGEREF _Toc2426 \h 46

9、输入数据  PAGEREF _Toc31502 \h 47

1)用std::cin输入数据  PAGEREF _Toc25652 \h 47

2)示例  PAGEREF _Toc9743 \h 47

10、算术运算  PAGEREF _Toc967 \h 48

11、自增和自减  PAGEREF _Toc28470 \h 49

12、赋值运算  PAGEREF _Toc5080 \h 50

1)赋值运算  PAGEREF _Toc21266 \h 50

2)示例  PAGEREF _Toc10290 \h 51

13C 11初始化赋值  PAGEREF _Toc25048 \h 51

1)C C 11初始化赋值  PAGEREF _Toc30081 \h 51

2)示例  PAGEREF _Toc30120 \h 52

14、关系运算  PAGEREF _Toc3328 \h 52

1)关系运算  PAGEREF _Toc25598 \h 52

2)示例  PAGEREF _Toc6822 \h 53

15、逻辑运算  PAGEREF _Toc19385 \h 55

1)逻辑运算  PAGEREF _Toc24971 \h 55

2)示例  PAGEREF _Toc27749 \h 55

16、逗号运算  PAGEREF _Toc20635 \h 56

1)逗号运算  PAGEREF _Toc6301 \h 56

2)示例  PAGEREF _Toc6618 \h 57

17、运算的优先级  PAGEREF _Toc9416 \h 57

1)运算的优先级  PAGEREF _Toc18623 \h 57

2)示例  PAGEREF _Toc31873 \h 60

18if语句的基本结构  PAGEREF _Toc30836 \h 62

2)示例  PAGEREF _Toc7265 \h 62

19、嵌套使用if语句  PAGEREF _Toc4344 \h 63

1)嵌套使用if语句  PAGEREF _Toc23309 \h 63

2)示例  PAGEREF _Toc27254 \h 64

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

2)示例  PAGEREF _Toc21873 \h 67

22if语句中的逻辑表达式  PAGEREF _Toc31793 \h 68

23、三目运算  PAGEREF _Toc6827 \h 69

24switch语句  PAGEREF _Toc23101 \h 70

25while循环语句  PAGEREF _Toc4346 \h 70

26、循环的跳转  PAGEREF _Toc31000 \h 71

if (once == false)  PAGEREF _Toc5549 \h 72

27for循环语句  PAGEREF _Toc4946 \h 73

28、嵌套使用循环  PAGEREF _Toc27048 \h 75

for (int jj = 1; jj <= ii; jj )  PAGEREF _Toc23685 \h 75

29do…while循环语句  PAGEREF _Toc14142 \h 76

30goto语句  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

36VS中调试程序  PAGEREF _Toc15776 \h 86

37、递归函数  PAGEREF _Toc3886 \h 87

38sizeof运算符  PAGEREF _Toc19366 \h 88

39、整型的基本概念  PAGEREF _Toc25540 \h 89

40、整数的书写  PAGEREF _Toc20488 \h 91

1、二进制  PAGEREF _Toc21967 \h 91

int c = 0B100001;   // 换算成十进制为 33  PAGEREF _Toc27509 \h 91

2、八进制  PAGEREF _Toc24963 \h 92

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

41C 11long 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

45C 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

2)指针常量  PAGEREF _Toc949 \h 112

3)常指针常量  PAGEREF _Toc26254 \h 113

54void关键字  PAGEREF _Toc26629 \h 114

1)函数的返回值用void,表示函数没有返回值。  PAGEREF _Toc18698 \h 114

int func(void)  PAGEREF _Toc2927 \h 115

3)的形参用void *,表示接受任意数据类型的指针  PAGEREF _Toc4821 \h 115

55C 内存模型  PAGEREF _Toc21519 \h 116

56、动态分配内存newdelete  PAGEREF _Toc145 \h 117

}/*  PAGEREF _Toc1835 \h 118

57、二级指针  PAGEREF _Toc30953 \h 118

58、空指针  PAGEREF _Toc21821 \h 120

1)使用空指针的后果  PAGEREF _Toc9474 \h 120

2C 11nullptr  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

eC 编译器把   数组名[下标]  解释为  *(数组首地址 下标)  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

67C风格的字符串  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

107const修饰成员函数  PAGEREF _Toc22620 \h 195

3const成员函数不能调用非const成员函数  PAGEREF _Toc10968 \h 195

1、为什么要保护类的成员变量不被修改?  PAGEREF _Toc14249 \h 196

CGirl(const string &name, int age)  PAGEREF _Toc23260 \h 196

108this指针  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

3CGirl(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

1dynamic_cast只适用于包含虚函数的类。  PAGEREF _Toc29132 \h 253

int attack;         // 攻击伤害。  PAGEREF _Toc21344 \h 253

137typeid运算符和type_info  PAGEREF _Toc8233 \h 255

140、自动推导类型auto  PAGEREF _Toc14641 \h 257

1auto声明的变量必须在定义时初始化  PAGEREF _Toc13343 \h 257

不要滥用autoauto在编程时真正的用途如下:  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

3C 14auto关键字  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 _Toc17914 \h 294

四、链接  PAGEREF _Toc19439 \h 294

五、更多细节  PAGEREF _Toc26178 \h 294

4)如果函数和类的定义不存在,编译不会报错,但链接会出现无法解析的外部命令。  PAGEREF _Toc27235 \h 295

12LinuxC 编译和链接的原理与VS一样。  PAGEREF _Toc7586 \h 295

167、命名空间  PAGEREF _Toc23083 \h 295

一、语法  PAGEREF _Toc8752 \h 295

二、使用命名空间  PAGEREF _Toc4083 \h 296

1)运算符::  PAGEREF _Toc31017 \h 296

语法:命名空间::名  PAGEREF _Toc23097 \h 296

2using声明  PAGEREF _Toc1122 \h 296

语法:using 命名空间::名  PAGEREF _Toc29579 \h 296

3using编译指令  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

169C 类型转换-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

181string容器  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

182vector容器  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

185list容器  PAGEREF _Toc21515 \h 327

一、 构造函数  PAGEREF _Toc17263 \h 328

1list();  // 创建一个空的list容器。  PAGEREF _Toc5237 \h 328

3list(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

185pair键值对  PAGEREF _Toc8873 \h 340

186map容器  PAGEREF _Toc6328 \h 343

一、构造函数  PAGEREF _Toc757 \h 344

1map();  // 创建一个空的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

187unordered_map容器  PAGEREF _Toc29545 \h 351

一、构造函数  PAGEREF _Toc10497 \h 352

1umap();  // 创建一个空的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

188queue容器  PAGEREF _Toc25086 \h 359

一、构造函数  PAGEREF _Toc2130 \h 359

1queue();  // 创建一个空的队列。  PAGEREF _Toc13657 \h 359

二、常用操作  PAGEREF _Toc4015 \h 360

三、其它操作  PAGEREF _Toc22556 \h 361

2void swap(queue<T> &q);    // 交换。  PAGEREF _Toc17785 \h 361

189STL其它容器  PAGEREF _Toc678 \h 362

一、array(静态数组)  PAGEREF _Toc28615 \h 362

1)物理结构  PAGEREF _Toc23833 \h 362

T elems_[size];  PAGEREF _Toc20210 \h 362

2)迭代器  PAGEREF _Toc1065 \h 362

3)特点  PAGEREF _Toc23478 \h 362

4)各种操作  PAGEREF _Toc26917 \h 362

4T &operator[](size_t n);  PAGEREF _Toc22401 \h 362

6T &at(size_t n);  PAGEREF _Toc4004 \h 362

////void func(int arr[][6],int len)  PAGEREF _Toc18436 \h 363

二、deque(双端队列)  PAGEREF _Toc32059 \h 365

1)物理结构  PAGEREF _Toc129 \h 365

2)迭代器  PAGEREF _Toc5148 \h 366

3)特点  PAGEREF _Toc11893 \h 366

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

3)特点  PAGEREF _Toc9530 \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

191STL算法  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

5reset()释放对象。  PAGEREF _Toc1503 \h 383

pp.reset();        // 释放pp对象指向的资源对象  PAGEREF _Toc26109 \h 383

6swap()交换两个unique_ptr的控制权。  PAGEREF _Toc694 \h 383

9unique_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

5reset()改变与资源的关联关系。  PAGEREF _Toc21508 \h 388

6swap()交换两个shared_ptr的控制权。  PAGEREF _Toc14949 \h 388

9shared_ptr提供了支持数组的具体化版本。  PAGEREF _Toc3111 \h 388

10shared_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

2endl  PAGEREF _Toc15288 \h 407

3)unitbuf  PAGEREF _Toc11174 \h 407

4nounitbuf  PAGEREF _Toc1452 \h 407

二、流状态  PAGEREF _Toc19550 \h 408

1eofbit  PAGEREF _Toc17260 \h 408

当输入流操作到达文件未尾时,将设置eofbit  PAGEREF _Toc24706 \h 408

2badbit  PAGEREF _Toc5999 \h 408

3failbit  PAGEREF _Toc18764 \h 408

fail()成员函数检查流是否设置了failbit  PAGEREF _Toc27705 \h 408

209C 异常  PAGEREF _Toc25752 \h 410

一、异常的语法  PAGEREF _Toc30708 \h 410

1)捕获全部的异常  PAGEREF _Toc10401 \h 410

try  PAGEREF _Toc30152 \h 410

2)捕获指定的异常  PAGEREF _Toc21118 \h 410

try  PAGEREF _Toc2766 \h 410

二、栈解旋  PAGEREF _Toc26040 \h 412

三、异常规范  PAGEREF _Toc15325 \h 412

四、C 标准库异常  PAGEREF _Toc28021 \h 413

五、重点关注的异常  PAGEREF _Toc17027 \h 413

1std::bad_alloc  PAGEREF _Toc13320 \h 413

int main()  PAGEREF _Toc17116 \h 413

2)std::bad_cast  PAGEREF _Toc3043 \h 414

3std::bad_typeid  PAGEREF _Toc12596 \h 414

六、逻辑错误异常  PAGEREF _Toc23873 \h 414

1std::out_of_range  PAGEREF _Toc28045 \h 414

2)std::length_error  PAGEREF _Toc1540 \h 414

3std::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

1std::range_error  PAGEREF _Toc10405 \h 416

2std::overflow_error  PAGEREF _Toc2654 \h 417

3std::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

210C 断言  PAGEREF _Toc25452 \h 419

一、断言  PAGEREF _Toc17461 \h 419

二、C 11静态断言  PAGEREF _Toc4920 \h 420

220C 11新标准  PAGEREF _Toc2891 \h 420

一、long long类型  PAGEREF _Toc2098 \h 420

二、char16_tchar32_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

222lambda函数  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

3C 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

240C 11线程  PAGEREF _Toc2104 \h 453

一、创建线程  PAGEREF _Toc29359 \h 453

线程类:std::thread  PAGEREF _Toc7173 \h 453

1thread() noexcept;  PAGEREF _Toc13252 \h 453

3)thread(const thread& ) = delete;  PAGEREF _Toc1910 \h 453

4thread(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

1get_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

1condition_variable(默认构造函数。  PAGEREF _Toc24393 \h 467

8wait_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

// 普通函数  PAGEREF _Toc93 \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



标签:

实例下载地址

C++基础课件和源代码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警