•第二期更新内容•C++11/14标准•Lambda、static_assert,typetraits,Movesemantics。。。•WIN32•消息,绘图,控件,资源,文件,内存,进程,线程。。。起源语言特点语言缺点C++语言及相关软件介绍day01前景与方向编译器安装与配置由C++起源:1974年Bjarne博士在分析与研究UNIX系统由与内核分布面造成的网络流量时试图寻找一种有效工具使其更加模块化他在c的增加了类似Simula的类的机制并与1983年开发一种新的语言C++;C++的语言特点1兼容c且继承了c的特性并同c一样高效且可移植2属于面向对象的编程抽象封装继承多态3语言灵活(类的层次结构设计)且支持指针3支持运算符重载4异常处理机制5支持泛型编程Tf(Tx){returnx*x;}6多种类库的支持语言缺点:语言复杂支持多种设计风格复杂的c++程序正确性不易保证C++的发展方向windows平台unix平台嵌入式C++也是一种编译型的语言推荐使用vs2013编译环境其他可选vc6.0vs2010nodepad++vs2013基本支持c11标准vs2010以上Vs2013是微软公司的一款软件开发平台IDE(集成开发环境)Vs2013的安装使用1安装前需要先安装IE10提供支持2下载安装包(中文版本)3打开安装包选择安装位置如下:4安装vs20135安装完成(20分钟左右)如何建立一个c++程序文件-新建-(visualc++类型)+win32consoleapplication自定义文件名文件路径-应用程序设置-其他选项-空工程-源文件-新建条目-c++文件-添加-完成C++的头文件名字空间简单的i/0函数一个简单的c++程序day02C++风格的操作Vs2013基本设置行号设置:工具-选项-文本编辑器-所有语言-行号选中快捷键:1复制:如果你想复制一整行代码,只需将光标移至该行,再使用组合键“Ctrl+C”来完成复制操作,而无需选择整行2剪切:如果你想剪切一整行代码,只需将光标移至该行,再使用组合键“Ctrl+X”来完成剪切操作,而无需选择整行。3删除:如果你想删除一整行代码,只需将光标移至该行,再使用组合键“Ctrl+L”来完成剪切操作,而无需选择整行。4粘贴:如果你想粘贴你已经复制的内容将光标移至该行再使用组合键“Ctrl+v”来完成粘贴操作5撤销:使用组合键“Ctrl+Z”进行撤销操作;6反撤销:使用组合键“Ctrl+Y”进行反撤销操作。7查找:Ctrl+f(Ctrl+H替换)8移动光标:home行首end行尾调试相关1)调试(启动):F5;(调试器)2)ctrl+s保存修改4)调试(逐语句):F11;5)调试(逐过程):F10;6)设置断点:F9。7)调试不执行:F71创建源文件c++的源文件的扩展名使用:.cpp.cc.C.cxx2#includeiostream为c++标准库的i/o函数的头文件c++旧式风格:iostream.hc++新式风格:iostreamcstring3usingnamespacestd;using编译指令指定使用的名字空间namespacestd标准名字空间4cina;coutaendl;c++的输入输出的方式cout为一个对象c++没有格式化字符串输出但有相应的格式化的控制符和流函数cout/cin还有明显的优点:类型识别功能可扩展性(重定义运算符支持各种数据类型)endl;控制符移动到光标所在的下一行二c风格的操作1#includestdio.h导入c头文件#includecstdio#include”add.h”//h可以不加其他库函数包含对应的头文件正常使用例:strcpy(a,b);编译:终端窗口:gccap1.cpp–lstdc++g++ap1.cppvs开发环境:F7相同名字空间的引入定义使用名字空间day03嵌套无名名字空间名字空间的引入:在C++中名称可以是变量函数结构体类及类的相关成员使用第三方类库时极有可能出现名称冲突c++利用作用域的特性引入了名字空间的概念名字空间:名字空间是一种描述逻辑分组的机制send(sendEx)send{sendEx}防止命名冲突跨文件访问注意:名字空间可以是全局的可以是位于另一个名称空间中不可以存在于代码块中1定义:namespaceA{intI;doubled;voidshow();}namespaceB{intIfloatf;}A中的I与B中的I并不发生冲突2相同名字空间可以多次添加补充名字空间的内容namespaceA{show(){…….}};非用户定义的名称空间存在于全局命名空间intI;使用:A::I=0;B::I=1;::I=2;//全局命名空间::为作用域解析运算符(域运算符)1Using:为了避免每次都使用名字空间时都要其进行名字空间限定可以使用using对名字空间内的内容进行特定区域的声明usingA::I;//using声明std::cout再次使用可以直接调用名称而无需增加空间限定这种声明可以全局全局域同名变量std::coutintInamespaceA{inti}main2using:作为编译指令的使用使对应名字空间内的所有内容可用且使用时可以省略作用域解析运算符usingnamespaceA;注意事项:1避免歧义usingA::I;usingB::I;I=1;//??哪一个?2不要用using声明相同名称的内容usingA::I;intI;3using做编译指令时名称空间为全局如果局部于名称空间的名字相同则局部覆盖名字空间内容namespace{externinti}4局部名称会覆盖全局与using指令的名字空间内容但可以用I(局部)::I(全局)A::I(名字空间)区分使用5using声明比using编译安全声明是指定具体内容编译器发出指示编译指令导入全部名字空间内容可能发生冲突覆盖时编译器不会发出警告名字空间的嵌套NamespaceA{inta;namespaceB{intb;}}访问:A::B::b=1;未命名名字空间:内部链接特性与static修饰的内容特性相同Namespace{inta;}coutaendl;补充:1Iostream相关函数存放在std的名字空间内UsingStd::cout.•内联名字空间(c++11)•关键字inline•一种新的嵌套名字空间的使用方式•嵌套在名字空间的内联名字空间在使用时不需其名字空间进行限定使用•Inlinenamespaceinspace{}布尔类型string类型结构体数据类型day04联合枚举1新的数据类型:布尔类型:bool表示布尔量的数据类型取值:由字面值常量true(非零)真false(‘\0’NULLfalse0)构成trueboolisok=true;boolnotok=false;2字面值truefalse可以通过提升转换为int类型true1false0inta=true;//a=1;3任何基本类型都可以被隐式转换为布尔类型转换后非0为真0为假二String类型(类)(自动处理大小)使用需要添加头文件stringC语言中是用字符数组来存放字符串chara1[10]=“abc”a2[2]={‘a’,’\0’};1初始化:stringstr1;stringstr2=“abc”;2String可以做赋值拼接等功能结构体:在c++中结构体内允许定义函数且结构体在计算大小时为1而C中为0在定义结构体时可以省略关键字struct联合:定义时可以省略联合名为匿名联合()访问时可以不用加联合的前缀X.枚举:枚举类型在c++中为一个独立的类型不能把一个整数赋值给一个枚举变量•C++11:•1类型的占位符auto•根据初始化的内容推断变量类型作用简化代码2nullptrstd::nullptr_t类型的值,用来指代空指针nullptr和任何指针类型以及类成员指针类型的空值之间可以发生隐式类型转换,同样也可以隐式转换为bool型.•强类型枚举•C++11中通过引入了一个称为强类型枚举的新类型,修正了这种情况。强类型枚举由关键字enumclass标识。它不会将枚举常量暴露到外层作用域中,也不会隐式转换为整形,并且拥有用户指定的特定类型(传统枚举也增加了这个性质)函数重载(函数多态)重载机制哑元函数函数重载一day051概念:同一作用域的一组参数列表不同,函数名相同的函数这组函数叫函数重载(C++允许定义相同名称的函数)作用:重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处(一物多用)参数列表不同:1参数类型不同2参数顺序不同3参数个数不同重载版本根据参数的匹配度进行选择注意:1.1与函数参数的变量名无关1.2函数的返回值类型与重载无关2函数重载的实现原理是通过c++换名实现的extern“C”intfun()的形式可以以c的方式生成函数名(无换名机制)3使用场景:当函数基本上执行相同的任务使用不同形式的数据时哑元函数缺省参数内联函数函数重载二day06哑元函数:参数只有类型没有形参名的函数voidfun(int);功能:1保持向前兼容性2做函数的区分Toperator++(){}Toperator++(int){}缺省参数如果函数的形参有缺省值,当函数调用时没有传递实参,那么形参就使用缺省值,如果调用函数时传递了实参,那么形参就使用实参的值注意:1缺省参数靠右原则如果一个函数有多个参数且部分参数有缺省值那么缺省值的参数必须靠右(在编译期间确定参数)2如果函数的声明和定义分开那么缺省参数只能写在函数的声明部分3注意防止重载的冲突(歧义)4c++中函数的规则不接受任何参数(否则可能构成重载)5凼数参数的缺省值叧能在凼数声明丨指定3内联:函数使用关键字inline关键字修饰的函数叫做内联函数函数调用过程:调用用后立即存储该指令的内存地址将函数参数复制到堆栈跳到标记函数起点的内存单元执行函数代码(可能还有返回值放入到寄存器中)将返回值弹出然后跳回到地址被保存的指令处内联的实质:就是把函数编译好的二进制代码替换成函数的调用指令(省去了调用开销)(空间换取时间)注意:1类中直接定义的函数自动被处理成内联函数,所以一般把内联函数放在头文件中2inline是一种请求,实现方式取决于编译器,特别是当函数较大或是递归的时候1引用的概念2如何创建一个引用3引用的本质指针与引用day074引用的应用5引用与指针1引用:引用是已定义变量的别名,为c++新增的一种复合类型2创建一个引用:intvar_i;int&revar_i=var_i;注意:1这里的&不是取址符而是类型标识符的一部分2创建引用时必需初始化3引用的内容不能为空null4引用创建之后就不能更换引用的内容int&ra=a;ra=b;这样定义之后我们就可以用var_i或rvar_i来操作变量var_i;3引用的本质:引用的内部是由指针完成实现的int*double*其本身并非一个实体类型(可由sizeof证明)int&double&4引用的应用:4.1做函数的参数省去函数参数进行复制时的内存开销常引用型的参数可以防止实参被无意修改且可以接受常量型与非常量型参数foo(constint&i){I=0}foo(a)4.2做函数的返回值做返回值时需保证返回值的有效性注意:不能返回局部变量的引用也可以返回常引用型的返回值补充:左值与非左值(右值)一般的左值参数是可以被引用的数据对象如:变量数组元素结构成员引用和解除引用的指针都是左值非左值包括字面常量(引号括起的字符串除外,它们由其地址表示)和包含多项的表达式intI;I=10;10=I;strings1=s2+s3+s4;(a++)临时变量temp(a+1),右值intc=(a+b)右值;“abc”=“abc”(++a)=1;左值int&&I=10;右值