当前位置: 首页 > news >正文

做电力产品的外贸网站湖南省住房城乡建设厅网站

做电力产品的外贸网站,湖南省住房城乡建设厅网站,老年大学网站建设,网站模版源代码第一章 C语言概述C是一种面向对象的程序设计语言抽象数据类型封装和信息隐藏以继承和派生方式实现程序的重用以运算符重载和虚函数来实现多态性以模板来实现类型的参数化 C是C语言的超集C继承了C语言简明、高效、灵活等众多优点以前使用C语言编写的大批软件可以不加任何修改语言概述C是一种面向对象的程序设计语言抽象数据类型封装和信息隐藏以继承和派生方式实现程序的重用以运算符重载和虚函数来实现多态性以模板来实现类型的参数化 C是C语言的超集C继承了C语言简明、高效、灵活等众多优点以前使用C语言编写的大批软件可以不加任何修改直接在C开发环境下维护C语言程序员只需要学习C扩充的新特性就可以很快地使用C编写程序面向对象程序设计的三个主要特征封装性继承性多态性C语言的基本符号字母包括大字母和小写字母共52个符号数字包括0-9共10个字符特殊符号包括 - * / , . _ : ; ? \ “ ‘ ~ | # % [] {} ^ 和空格共30个符号。C语言的词汇关键字也称保留字它是由C语言本身预先定义好的一类单词。其中是ANSI C标准规定的32个关键字ANSI C标准补充的29个关键字。标识符是用户为程序中各种需要命名的“元素”所起的名字。这些元素包括变量、符号、常量、函数、函数的参数、结构、类、对象等。标识符的命名规则标识符以一个字母或下划线开头的由字母、数字、下划线组成的字符串不能与任意一个关键字同名标识符中的字母区分大小写标识符不宜过长字面常量运算符标点符号C程序的基本框架一个简单的C程序 123456#include iostreamint main(){ std::coutThis a simple C program.\n; return 0;} cout是C中的标准输出流对象它通常代表计算机屏幕。 cout在标准头文件iostream中被声明注标识符cout位于std名字空间中须用前缀std::进行修饰。 “”是输出操作符功能是将它右边的内容输出到它左边的指定设备上。 此程序的运行结果是在屏幕上显示:This a simple C program. 注释///* */C程序的开发过程编辑编译连接运行和调试第二章 数据类型、运算符和表达式C语言的数据类型基本类型 逻辑性用关键字bool表示因此又称为bool型布尔型。逻辑型的取值只包括true和false它们都是C关键字。其中true对应整数1false对应整数0表示逻辑假。 字符型字符型用关键字char表示因此又称为char型。字符型的取值范围是全部基本字符以及ASCII码集或扩充ASCII码集对应的全部符号。字符型数据占用1字节Byte即8位bit空间。 整型整型用关键字int表示。16位计算机中整型变量占2个字节而在32位计算机中整型变量占4个字节。 浮点型浮点型包括单精度和双精度单精度用关键字float表示双精度用关键字float表示。float型数据一般占用4字节Byte即32位bit空间double型数据一般占用8字节即64位空间。 空值型空值型用关键字void表示空值型的取值为空。 基本类型的派生类型 派生类型声明符由基本类型关键字char、int、float、double前面加上类型修饰符组成。类型修饰符包括 short 短类型缩短字长long 长类型家常字长signed 有符号类型取值范围包括正负值unsigned 无符号类型取值范围包括正值 常量常量是指在程序执行过程中值不改变的量。常量有两个表示形式即字面常量和符合常量。字面常量的类型是根据书写形式来区分的例如15-0.226’a’”Hello Word”等都是字面常量他们的类型分别是整型、浮点型、字符型、字符串型每个字面常量的字面本身就是它的值。符号常量是一个标识符在程序中必须遵循“先声明后使用”的原则。 逻辑常量值是true或false。 字符常量简称字符以单引号作为起止符号中间有一个或若干个字符。例如’a’和’’单引号中间有一个字符这是一般意义上的字符常量除此之外还有一种特殊形式的字符常量例如’\n’’\146’’\x6E’等以“\”开头的包括多个字符的字符序列也都是符合规定的字符常量。 整型常量十进制整数、八进制整数和十六进制整数。 实型常量 定点表示 定点表示的实数简称定点数即以小数形式表示实数。 定点表示的实数由一个正好或负号正号可以省略后接若干个十进制数字和一个小数点组成这个小数点可以处在任何一个数字位的前面或后面。 浮点表示 浮点标书的实数简称浮点数即以指数形式表示实数。 对于一个浮点数若将它尾数中的小数点调整到最左边第一个非零数字的后面则称它为规格化或标准化浮点数这有些类似于数学中的科学计数法。例如41.6E8和-0.077E5是非规格化的。 实型常量分为单精度float、双精度double和长双精度long double。 枚举常量是枚举类型中定义的值即枚举值。 枚举类型的语法格式为 enum 类型名{ 枚举值表 } 变量变量是程序中用于存储信息的单元它对应于某个内存空间。 变量的定义 变量声明语句的一般格式 [存储类] 类型名 变量名[初值表达式] 存储类有四种分别是auto、register、static、extern默认的存储类是auto。 类型名已存在的一种数据类型名称如char、short、int、long、float、double等基本数据类型名或者用户定义的数据类型名。 变量名用户定义的一个标识符用来表示一个变量该变量可以可以通过后面的可以选项赋予一个值成为给变量赋初值。若变量名后不带有初始表达式则不为变量赋予任何值此时的变量值不确定。 初值表达式是一个表达式它的值就是赋予变量的初值。 变量的使用方式 全局变量和局部变量 全局变量在所有函数定义、类定义和程序块之外声明的变量 局部变量在某个函数定义、类定义或程序块之内声明的变量 生存期与作用域 变量的存储类属性 auto变量用关键字auto声明的局部变量称为自动变量。auto为变量声明时的默认存储类别即在变量定义时如果不显示标明存储类别则系统自动按auto变量处理。auto变量所占用存储空间的分配和释放工作有系统自动完成。 register变量用关键字register声明的局部变量称为寄存器变量。register变量可能以寄存器作为其存储空间。 static变量用关键字static声明的变量称为静态变量。 extern变量用关键字extern声明的变量称为外部变量。 typedef类型说明 使用关键字typedef可以为已有类型名定义一个新类型名。语法格式 typedef已有类型名 新类型名 符号变量声明语句 符号常量在使用之前必须先进行定义。符号常量定义语句同变量定义语句类似其语法格式为 const 类型名 符号常量名 初值表达式,…; 运算符和表达式运算符和表达式概念C语言中运算符可以根据其运算分量个数的多少分为单目或一元运算符 、 双目或二元运算符 、 三目或三元运算符3类。运算类型与运算符每一种运算与其他运算的区别在于以下3个方面 参与运算的运算分量的数量和类型运算结果的数据类型运算的具体操作同一类运算可以组成一种运算类型凡是具有相同运算分量和结果类型的运算划分为同一类运算比如算术运算符、关系运算符、逻辑运算、位运算等。 赋值运算赋值运算是一种双目运算其形式为 变量名 表达式 赋值运算的具体操作作为先计算右端表达式的值然后把该值赋给左端变量 算术运算符和算术表达式算术运算是指int型、float型、double型也包括char型的数值类数据计算后得到同一类型数据的运算。算术运算中所使用的运算符称为算术运算符。 单目算术运算符包括-单减、增量和 –减量 单减运算的格式为-运算分量 增量运算分为前缀和后缀增量 双目算术运算符包括、-、*、/、%取余。 算术表达式由算术运算符包括单目和双目连接运算分量而组成的式子称为算术表达式。 关系运算符和关系表达式C语言提供了6种关系运算符它们是 小于 大于等于 大于大于等于 等于! 不等于关系运算的使用格式 运算分量 关系运算符 运算分量 逻辑运算符合逻辑表达式C语言提供了3种逻辑运算符它们是 逻辑非 逻辑与|| 逻辑或逻辑运算符的使用格式为 逻辑运算符! 运算分量运算分量 逻辑运算符或|| 运算分量位运算C提供6种运算符双目位运算符按位与、|按位或、^按位异或、按位右移、按位左移单目位运算符~按位取反其他运算条件运算符 使用格式 表达式1?表达式2:表达式3 逗号运算符 C中使用逗号运算符指明对多个表达式进行顺序求值使用格式 表达式1,表达式2,...,表达式3 sizeof 使用运算符sizeof可以进行字长提取操作因此sizeof运算符又称为字长提取符使用格式 sizeof(运算分量)字长提取运算的结果为一个整数该整数表示指定的类型或变量的字节长度即在内存中占用的字节Byte数。 圆括号运算符 C中不仅将圆括号()归为运算符而且根据不同的使用方式可以对圆括号运算符的功能作出以下3种不同的解释。1圆括号用于函数调用格式是 函数名(实参表) 2圆括号用于强制类型转换格式是 (类型名)表达式 3圆括号用于类型构造格式是 类型名表达式 优先级和结合性C中运算符的种类相当丰富每个运算符的使用方法和操作方式也各不相同。 根据运算符的优先级和结合性可以将表达式的计算顺序规则总结为一下3条 有限计算带有括号的子表达式。 在没有括号的部分依照运算符优先级有高到低进行计算。 具有相同优先级的运算符按照结核性规定依次进行计算。 运算符优先级“”高于“” 第三章 基本控制结构C语句语句是C程序中的基本功能单位。C语句按照不同功能大体分为6种类型声明语句表达式语句选择语句循环语句跳转语句复活语句顺序结构在一个没有选择和循环结构的程序中语句将按照书写的先后顺序从左到右自上而下依次执行。 声明语句 变量声明 char ch; //声明和定义char型变量 int count 1; //声明、定义和初始化int型变量 extern int error_num; //声明int型变量 常量声明 const int MAX_LEN 128; //声明、定义和初始化int型常量 函数声明 double sqrt(double); 类型声明 typedef unsigned int ID; //声明和定义类型 enmu Color{RED,GREEN,BLUE}; //声明和定义枚举 struct Date{int y,m,d}; //声明和定义结构 class Employee; //声明类 表达式语句 C所有对数据的操作和处理工作都是通过表达式语句来完成的。基本输入输出 coutExpr; //数据输出操作cinVar; //数据输入操作复合语句与空语句 复合语句和空语句并不是功能上独立的一类语句。但是复合语句能够实现语句块的概念空语句也可以在一些情况下排上用场 有了复合语句和空语句会使C程序的设计变得更加方便 选择结构if语句 基本的if语句if…else语句if语句的嵌套 注意C中规定else关键字总是与它前面最近的未匹配的且课件的那个if关键字配对。 switch语句 循环结构for语句while语句do…while语句循环的嵌套跳转语句break只用于循环和switch语句中 continue只用于循环语句。功能跳转本次循环继续下一轮循环。 return只在函数体中。 goto跳转到标记的语句位置。 第四章 数组、指针与引用数组Array是由固定数目元素组成的数据结构同意数组的所有元素的类型都相同。数组元素是通过下标进行访问的数组可以是一维的也可以是多为的许多重要应用的数据节后都是基于数组的。数组一维数组 一维数组的定义 数据类型数组名[数组长度] 一维数组的初始化 int v1[] {1,2,3,4}; char v2[] {a,b,c,d}; 访问数组 数组名[表达式] 多维数组 二维数组的定义 数据类型数组名[表达式1][表达式2] 二维数组的初始化 int v1[3][4] {{1,2,3,4},{1,2,3,4}{1,2,3,4}}; 访问数组 数组名[表达式1][表达式2] 多维数组字符数组 string类型 string name William Jacob;在使用string数据类型之前需要在程序中包含文件string# include string并声明其所在的名字空间std。 在C字符串由零个或多个字符组成并且所有字符都由双引号括住。 字符数组 所有的元素都是char类型的数组成为字符数组。C中空字符用‘\0’来表示。在C中空字符’\0’用来作为一个字符串结束的标志。 字符数组与字符串之间存在细微的差别字符串以空字符结尾即字符串的最后一个字符总是空字符而字符数组可以不含空字符。 常用字符串函数C提供了一系列字符串操作的函数这些函数都包含在头文件cstring中引用# include cstring。指针指针即指针变量是C语言最强大的功能之一同时也是最棘手的功能之一。一个指针是一个特定类型数据的存储地址。 指针的声明形式 数据类型 * 变量名 指针使用两种特殊的运算符—— * 和 一元运算符用于返回其操作对象的内存地址其操作对象通常为一个变量。 C的引用。只能在定义时被赋值ba表明b与a等价 * 与的作用相反用于返回其操作数所指对象的值因此该运算符要求其操作对象为一个指针。 注意在使用任何指针变量之前必须先给它赋一个指向合法具体对象的地址值。否则系统会给指针变量赋值一个随机值该赋值可能会破坏内存中某个地址空间中的内容严重时将导致程序挂起或机器死机。 使一个指针指向一个具体对象的方法有使用new运算符或malloc和alloc等函数给指针分配一个具体空间。将另一个同类型的指针赋给它以获得值。通过运算符指向某个对象。指针运算指针和整型量可以进行加减若p1和p2为指针当p1和p2指向同一个类型时可以进行赋值。如p1p2则p1和p2指向同一个对象。两个指向同一类型的指针可进行、、等关系运算其实就是地址的比较。两个指向同一数组成员的指针可进行相减结果为两个指针之间相差元素的个数。 注意两个指针不能相加 几组常见的指针运算表达式比较p与p1的区别指针p结果为p指向下一个元素p1结果为下一个元素的指针但是p本身不变y*px1和y*(px1)的区别*px1结果取px所指对象内容加1*(px1)结果为px指针加1。y*(px)和y*px1的区别*(px)指先取指针px所指对象内容进行运算然后对指针px所指对象内容加1*px1 指先取指针px所指对象内容进行运算然后对指针px加1指针和数组 在C中数组的名字就是指向改数组第一个元素下标为0的指针即该数组第一个元素的地址也即数组的首地址。一般情况下一个数组元素的下标访问a[i]等价于相应的指针访问*(ai) 但特别注意的是数组名和指针变量是有区别的前者是常量即数组名是一个常量指针而后者是指针变量。因此尽管可以写成pxa,但不能写成apx或a或pxa,因为我们不能改变常量的值也不能取常量的地址。 数组名可作为参数进行传递。 使用指针的原因指针运算比数组运算的速度快使用指针的另外一个原因是在大量数据传递是传递指针要远比传递数据本身效率高的多如在函数参数传递及函数返回值时。 当然使用指针会给程序带来安全隐患如指针悬挂问题同时降低程序的可读性。 引用引用是个别名建立时必须用另一个数据对象如一个变量的名字进行初始化以指定该引用所代表的数据对象。此后对引用的任何操作实际上就是对所代表的数据对象的操作。系统不会为引用再次分配存储空间。 注意引用运算符与地址操作符使用的是相同的符号即运算符加载但它们的韩不一样引用运算符只在声明变量的时候使用它放在类型名后面。 使用引用时应遵循一定的规则 创建引用时必须立即对其进行初始化指针则可以在任何时候被初始化 一旦一个引用被初始化为一个对象的引用它就不能再被改变为对另一个对象的引用指针则可以在任何时候改变为指向另一个对象 不可能有NULL引用必须确保引用是对具体合法的对象的引用即引用应和一块合法的存储空间共联 用引用传递函数参数 如果有占用空间大的对象需要作为函数参数传递的时候在C语言中的做法往往是使用指针因为这样可以避免将整个实参对象数据全部复制给形式参数可以提高程序执行效率。而在C中由于引入了引用的该男因此既可以使用指针亦可以用引用来做同样的事情。 引用真作为参数的最大的好处是既可以想指针那样工作其实用方式又和一般变量相同。也就是说引用比指针具有更好的可读性。 动态存储分配 静态存储分配到目前为止程序中用于存储数据的变量和数组等实体在使用前都必须通过声明语句进行定义。C编译器根据这些声明语句了解它们所需存储空间大小并预先为其分配适当的内存空间。也就是说这些变量或数组在内存中所占据的空间大小必须在编译时确定下来这种内存分配方式成为“静态存储分配”。data表示取值 data和data 动态存储分配很多情况下程序中所需要的内存数量只有等到运行时刻才能确定下来这是就应使用“动态存储分配”的方式申请获得指定大小的内存空间当动态分配的内存闲置不用时同样有必要对其进行释放。 new分配空间对某种类型变量进行动态分配指针 new 类型对数组进行动态分配指针 new 类型 [元素个数] 使用new动态分配的数组与一般定义语句声明的数组之间的最大区别是前者的元素个数可以是一个变量而后者的元素个数必须是常量。 delete释放空间单个变量 delete 指针数组 delete[] 指针 无参数第五章 函数函数是一个可以独立完成某个功能的语句块。C程序其实就是由一系列的函数组成main函数是其中的一个函数C程序从main函数开始执行。 函数作用 将复杂程序拆成若干易于实现的子程序。将程序中重复出现的功能封装到一个函数中这样该功能只需在一个函数中实现在程序中用到该功能的地方只需要调用该函数即可这样既提高了程序的开发效率也提高了程序的可靠性 同时也极大地增强了程序的可读性。函数的定义用户自定义函数形式 1234返回类型 函数名(形参列表){ 函数体} C中return是一个关键字当函数执行到return语句时函数将立即终止执行并将程序的控制权返回给调用函数。因此如果执行到main函数中的return语句时整个程序将终止。 当一个函数带有返回值时应保证函数每个可能执行路径上应有返回值。 return语句的第二种形式用于无返回值的函数即函数返回类型为void。此时函数进将程序控制返回给调用函数并不返回一个值。当函数没有return语句时在执行完最后一条语句后将返回到调用函数。 函数调用调用的一般形式 1函数名(实参表)函数的调用方法分为 语句调用通常是不带返回值的函数。 表达式调用将被调用的函数作为表达式的一部分进行调用适用于被调用函数带有返回值的情况。 参数调用被调用函数作为另个一函数的一个参数进行调用。 函数原型在C中函数使用之前要预先声明这种声明在标准C中称为函数原型。 函数原型的语法 1返回类型 函数名(形参列表);函数原型声明的两种形式 直接使用函数定义的头部并在后面加上一个分号。 在函数原型声明中省略参数列表中的形参变量名仅给出函数名、函数类型、参数个数及次序。如int max int int; C中调用任何函数之前必须保证它已有原型声明。函数原型通常放在程序文件的头部以使得该文件中所有函数都能调用它们。实际上标准函数的原型声明放在了相应的头文件中。 函数返回类型根据函数是否带有参数以及函数是否有返回值可以将函数分为如下四类 带参数的有返回值的函数 不带参数的有返回值函数 带参数的无返回值函数 不带参数的无返回值函数 函数参数参数的传递方式 传值将实参的副本传递拷贝给被调用函数的形参不改变原值。 传地址改变原值 有时需要函数调用来改变实参变量的值或通过函数调用返回多个值这时仅靠传值方式是不能达到目的的。 传指针属于显式传递地址因此尽管传递指针可以达到目的但传递方式略显笨拙而且也不直观。 函数引用参数仅在函数定义时说明而带引用参数的函数的调用形式与值参数相同。 C中当函数参数需要传递地址时建议使用引用来替代指针因为引用比指针更加直观。 引用的适用情形要从函数中返回多个值通过函数调用要改动实参值传递地址可以洁身拷贝大量数据所需的内存空间和时间默认参数 C中可以为形参指定默认值在函数调用时没有指定与形参相对应的实参时就自动使用默认值。默认参数可以简化复杂函数的调用。 如果一个函数中有多个参数则默认参数应从右至左逐个定义。 C引入默认参数使得程序员能够处理更为复杂的问题。使用默认参数程序员只需记住针对确切情形有意义的参数不需要指定常见情况下使用的参数。 函数重载在C中编写函数时必须确保函数名唯一。但是C中可以共用相同的函数名。 函数重载用同一个函数名字在不同类型上做相类似的操作就会方便很多这种情况较函数重载。 C根据所传递的实参的不同调用相应的函数u得到期望的效果。 C中的函数重载中如果函数知识函数类型不同而其他参数个数及类型完全相同则不能作为重载函数来使用。 注意让重载函数执行不同的功能是非常不好的程序设计风格同名函数应该具有相同的功能。 内联函数C引入内联函数的原因是用它来取代C中的预处理宏函数内联函数与宏函数的区别 宏函数是有预处理器对宏进行替换内联函数是通过编译器实现的内联函数是真正的函数只有在调用的时候内联函数像宏函数一样展开所以它没有一般函数的参数压栈和退栈操作减少了调用开销因此内联函数比普通函数执行效率更高。 C中使用inline关键字来定义内联函数inline关键字放在函数定义声明中函数类型之前。 编译器会将在类的说明部分定义的任何函数都认定为内联函数即使它们没有用inline说明。 注意 内联函数使用方式和一般函数一样只不过在程序执行时并不产生实际函数调用而是在函数调用处将函数代码展开执行。 内联函数有一定的局限性就是函数中的执行代码不能太多结构也不能太复杂。如果内联函数的函数体过大编译器将会放弃内联方式而是采用普通的方式调用函数。 递归函数如果一个函数在其函数体内直接或者间接地调用了自己该函数就被称为递归函数。递归是解决某些复杂问题的十分有效的方法。 递归适用的场合 数据的定义形式按递归定义。 数据之间的关系即数据结构按递归定义的如树的遍历图的搜索等。 问题解决按递归算法实现的例如回溯法。 使用递归需要注意以下几点 用递归编写代码往往较为简洁但要牺牲一定的效率因为系统处理递归函数时都是通过压栈/退栈的方式实现的。 无论哪种递归调用都必须有递归出口即结束递归调用的条件。 编写递归函数时需要进行递归分析既要保证正确使用了递归语句还要保证完成了相应的操作。 变量的生存周期全局变量变量由编译程序在编译时给其分配存储空间称为静态存储分配并在程序执行过程中始终存在。这类变量的生存周期与程序的运行周期相同。 局部变量变量由程序运行时自动给其分配存储空间称为动态存储分配这类变量为函数或块中定义的自动变量。这类变量的生存周期与函数或块的执行周期相同。 由于作用域的屏蔽效应如果函数中有同名变量则不能访问外部变量。为了能在函数内部访问外定义的变量可以使用C中的作用域运算符::。 当程序较大时利用名字评比机制是非常必要的但是这也会导致程序的可读性变差好的程序设计风格应尽量避免名字屏蔽。 第六章 类和对象类是面向对象程序设计的核心通过抽象数据类型方法实现的一种用户自定义数据类型它包含了数据和对数据进行操作的函数利用类可以实现数据的封装和隐藏。 类的定义类是一种由用户定义的复杂数据类型它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。C中类概念的目标就是为程序员提供一种建立新类型的工具使这些新类型的使用能够像内部数据类型一样方便。类定义的一般格式 123456789101112// 类的说明部分class 类名{public: 成员函数或数据成员的说明 \ //公有成员外部接口protected: 数据成员或成员函数的说明 \ //保护成员private: 数据成员或成员函数的说明 \ //私有成员}; // 类的实现部分// 各个成员函数的实现花括号表示类的声明范围其后的分号表示类申明结束。 类的成员包括数据成员和成员函数分别描述类所表达的问题的属性和行为。 关键字public、private和protected成为访问权限修饰符它们限制了类成员的访问控制范围。 各个成员函数的实现既可以在类体内定义也可以在类体外定义。 如果一个成员函数在类体内进行了定义它将不出现类的实现部分如果所有的成员函数都在类体内进行了定义则可以省略类的实现部分。在类体内定义的成员函数都是内联函数。 类成员的访问控制 类中的成员具有不同的访问权限修饰符。这些不同的访问权限修饰符限制了类成员的不同访问控制范围。三种访问控制权限 公有public定义类的外部接口任何来自类外部的访问都必须通过外部接口进行。 私有private私有类型的成员只允许本类的成员函数访问来自类外部的访问都是非法的。 保护protected介于共有类型和又有类型之间在继承 和派生时可以体现其特点。 类中成员默认的访问权限是私有的private。 类的数据成员 类中的数据成员描述类所表达的问题的属性。数据成员在类体中进行定义其定义方式与一般变量相同但对数据成员的访问要收到访问权限修饰符的控制。定义了类的数据成员时注意的问题 类中的数据成员可以是任意类型包括整型、浮点型、字符型、数组、指针和引用等也可以是对象。 但是要注意的是只有其他类的对象才可以作为该类的成员即作为该类的成员对象而存在。自身类的对象是不可以作为自身类的成员存在的但自身类的指针可以。 在类体中不允许对所定义的数据成员进行初始化。 类的成员函数 类的成员函数描述类所表达的问题的行为。类中所有的成员函数都必须在类体内进行说明。但成员函数的定义既可以在类体中给出也可以在类体外给出。 在类外部对成员函数进行定义一般格式 1234返回类型 类名::成员函数名(参数表){ 函数体}成员函数的两种定义方式的差别 如果一个成员函数的声明和定义都在类体内这个成员函数就是内联函数。如果一个成员函数的声明在类体内而定义在类外这时对该成员函数的调用时按一般函数进行的。 若要将定义在类体外的成员函数也作为内联函数处理就必须在成员函数的定义前加上关键字inline以此显式地说明该成员函数也是一个内联函数。 成员函数除了可以定义为内联函数意外也可以进行重载可以对其形参设置默认值。 对象的定义对象是类的实例一个对象必须属于一个已知的类。因此定义对象之前必须先定义该对象所属的类。 对象的定义格式如下 1类名 对象名(参数表);类名待定义的对象所述的类的名字。 对象名可以是一个或多个对象名多个对象名之间用逗号隔开。 参数表初始化对象时需要的建立对象时可以根据给定的参数调用相应的构造函数对对象进行初始化。无参数时表示调用类的默认构造函数。 除了定义一般对象外还可以定义对象数组、指向对象的指针或引用。 对象的成员 一个对象的成员就是该对象的类所定义的成员包括数据成员 和 成员函数。定义对象后可以使用“.”运算符和“-”运算符访问对象的成员。 “.”运算符适用于一般对象和引用对象。 “-”运算符适用与指针对象即指向对象的指针。 实际上一般对象成员与指针对象成员的表示方法只是形式上有所不同本质上是相同的。 构造函数和析构函数构造函数与析构函数的定义 构造函数的作用在对象被创建时利用特定的值构造对象将对象初始化为一种特定的状态对数据成员进行初始化使该对象具有区别于其他对象的特征。 构造函数在对象被创建时有系统自动调用。 构造函数也是类的成员函数但是它是一种特殊的成员函数它除了具有一般成员函数的特征之外还具有一些特殊的性质 构造函数的名字必须与类名相同。构造函数不指定返回类型它隐含有返回值由系统内部使用。构造函数可以有一个或多个参数因此构造函数可以重载。在创建对象时系统会自动调用构造函数。构造函数的格式 123456类名::构造函数名(形参表)(初始化列表);// 例如Date::Date(int y,int m,imt d):year(y),month(m),day(d){ 构造函数体} 初始化列表冒号后面是一个构造函数的初始化列表用于初始化类中的各个数据成员。初始化列表位于构造函数的形参表后面有一个冒号和逗号分割的若干项构成。初始化列表形式为成员名(表达式)构成。 在构造函数中初始化优先于赋值。在调用构造函数对类对象初始化时先执行初始化列表对各个成员进行初始化再执行构造函数体。 初始化顺序:初始化列表中各个初始化项的执行顺序取决于类成员在类中声明的顺序而与初始化列表中给出的初始化项的顺序无关. 数据成员初始化方式既可以使用初始化列表的方式获得显式初值也可以在获得默认初值后再在构造函数体中使用赋值语句将表达式的值负值给数据成员。 析构函数与构造函数的作用几乎正好相反它用来完成对象被删除前的以前清理工作也就是专门做扫尾工作的。一般情况下析构函数在对象的生存周期即将结束的时候由系统自动调用。它的调用完成之后对象也就消失了相应的内存空间也就被释放。 析构函数也是类中的一种成员函数具有以下特性 析构函数名是在类名前加一个取反求补符号~。析构函数不指定返回类型它隐含有返回值由系统内部使用。析构函数没有参数因此析构函数不能重载一个类中只能定义一个析构函数。在撤销对象时系统会自动调用析构函数。 注意析构函数的调用顺序与构造函数的调用顺序是完全相反的。 默认构造函数和默认析构函数 默认构造函数就是调用时不必提供参数的构造函数它的函数名与类名相同它的参数表或者为空或者它所有参数都具有默认值。 如果类中定义了一个默认的构造则使用该函数如果一个类中没有定义任何构造函数编译器将会生成一个不带参数的公有默认构造函数它的定义格式类名::类名(){}同理公有的默认析构函数格式是类名::~类名(){}。 复制构造函数 复制构造函数的功能用一个已知的对象去初始化一个正在创建的对象。 类中还有一种特殊的构造函数叫做复制构造函数它用一个已知的对象初始化出一个正在创建的同类对象复制构造函数的一般格式如下 1234类名::类名(const类名 引用对象名){ //复制构造函数体}复制构造函数具有的特点 也是一种构造函数因此函数名与类名相同并且不能指定函数返回类型。 只有一个参数是对同类的某个对象的引用。 每一个类中都必须有一个复制构造函数。如果类中没有声明复制构造函数编译器会自动生成一个具有上述形式的公有复制构造函数。 通常情况下复制构造函数在下面情况下回被调用 用类的一个已知的对象去初始化该类的另一个正在被创建的对象。 采用传值调用方式时对象作为函数实参传递给函数形参。 对象作为函数返回值。 自由存储对象定义到目前为止在为程序中定义的对象分配内存空间时采用的都是“静态存储方式”在编译时就能确定所占存储空间的大小而与之相对的动态存储分配技术则可以保证在程序运行过程中按照实际需要申请适量的内存使用结束后在进行释放。这种程序运行过程中根据需要可以随时建立或删除的对象成为自由存储对象。建立和删除工作分别由运算符new和delete完成。 用new创建单个对象时要根据参数调用相应的构造函数在用new创建对象数组时会调用默认构造函数用delete删除对象时要调用析构函数。 在对自由存储对象调用构造函数和析构函数时要注意这时的调用时显式进行的调用的顺序取决于new和delete运算符的顺序。这时析构函数的执行顺序不一定与构造函数的执行顺序严格相反但对象数组中各个元素的构造和析构顺序仍然是相反的。 this指针C中提供一种特殊的对象指针——this指针它是成员函数所属对象的指针它指向类对象的地址。成员函数可以通过这个指针知道自己属于哪一个对象。 this是一个隐含的指针它隐含于每一个类的非静态成员函数中它明确地表示出了成员函数当前操作的数据所属的对象。当一个对象调用成员函数时编译程序先将对象的地址赋值给this指针然后调用成员函数。每次成员函数存取数据成员时会隐含使用this指针。 静态成员对于类中的非静态成员每一个类对象都拥有一个副本即每个对象的同名数据成员可以分别存储不同的数值这是保证每个对象拥有区别于其他对象的特征的需求。 类中的静态成员则是解决同一个类不同对象之间的数据和函数共享问题的。静态成员的特性是不管这个类创建了多少个对象它都只有一个副本这个副本由所有属于这个类的对象共享。静态成员表示整个类范围的信息其声明以static关键字开始包括静态数据成员和静态成员函数。 静态数据成员 示例 123456class MyClass{private: int a,b,c; static int sum; //私有静态数据成员};说明 sum是静态数据成员它被MyClass类的所有对象共享但它不属于MyClass类的任何一个对象它的作用域是类范围。 静态数据成员在每个类对象中并不占有存储空间它只是在每个类中分配有存储空间供所有对象公用。静态数据成员的值对每一个对象都是一样的。 初始化静态数据成员具有静态生存周期必须对它进行初始化。静态数据成员初始化的一般格式如下。 1数据类型 类名::静态数据成员名初始值 对静态数据成员初始化时注意 由于在类的声明中仅仅是对静态数据成员进行了引用性声明因此必须在文件作用域的某个地方对静态数据成员进行定义并初始化即应在类体外对静态数据成员进行初始化静态数据成员的初始化与它的访问控制权限无关。 静态数据成员初始化时前面不需要加static关键字以免与一般静态变量或对象混淆。 由于静态数据成员是类的成员因此在初始化时必须使用作用域运算符(::)限定它所属的类。 静态成员函数 公有的静态成员可以直接访问但是私有的或保护的静态数据成员却必须通过公用的接口进行访问一般将这个公用的接口定义为静态成员函数。 使用static关键字声明的成员函数就是静态成员函数静态成员函数也是属于整个类而不属于类中的某个对象它是该类的所有对象共享的成员函数。 静态成员函数既可以在类体内进行定义也可以在类体外定义。当在类体外定义时要注意不能使用static关键字作为前缀。 由于静态成员函数在类中只有一个副本因此它访问对象的成员时收到一些限制静态成员函数可以直接访问类中说明的静态成员但不能直接访问类中说明的非静态成员若要访问非静态成员时必须通过参数传递的方式得到相应的对象在通过对象进行访问。 公有的静态成员既可以直接使用作用域运算符通过类名进行访问也可以通过类的任何对象进行访问但是建议使用前者访问即 123类名::静态数据成员名或类名::静态数据成员名(参数表) 由于静态成员在该类的任何对象被建立之前就存在因此静态成员可以在程序内部不依赖于任何对象被访问即使没有建立该类的任何一个对象时也可以使用作用域运算符通过类名访问类的共有静态成员。 常成员存在的意义虽然数据隐藏保证了数据的安全性但各种形式的数据共享却又不同程度地破坏了数据的安全性。因此对于既需要共享又需要防止改变的数据应该定义为常量进行保护以保证它在整个程序运行期间是不可改变的。 这些常量需要使用const修饰符进行定义。const关键字不仅可以修饰类对象本身也可以修饰类对象的成员函数和数据成员分别称为常对象、常成员函数和常数据成员。 常对象 使用const关键字修饰符的对象称为常对象其定义格式如下 123类名 const 对象名或const 类名 对象名 常对象在定义时必须进行初始化而且不能被更新。 常成员函数 使用const关键字说明的成员函数被称为常成员函数常成员函数的说明格式如下 1234567891011121314151617181920212223242526272829 返回类型 成员函数名(参数表) const; - const是函数类型的一个组成部分因此在函数实现部分也要带有const关键字如果在定义常成员函数时丢失了const关键字程序会产生错误。 - 常成员函数也不能更新对象的数据成员否则也会产生错误。 - 当成员函数时常成员函数时常对象和一般对象都是可以调用它的但是对于一般成员函数则只有一般对象可以调用常对象不能调用一般成员函数如果调用它将会产生错误。 - const关键字可以用于参与对重载函数的区分。重载的原则是常对象调用常成员函数一般对象调用一般成员函数。此处需要注意的是当类中只有一个常成员函数时一般对象也可以调用该常成员函数。但当两个同名的一般成员函数和常成员函数同时存在时遵循上述重载原则。- 常数据成员 - 使用const说明的数据成员称为常数据成员。常数据成员的定义与一般常量的定义方式相同只是它的定义必须出现在类体内。 - 常数据成员同样也必须进行初始化并且不能被更新。但常数据成员的初始化只能通过**构造函数**的成员初始化列表显示进行。## 友元- 存在的意义类具有数据**封装和隐藏**的特性只有类的成员函数才能访问类的私有成员和保护成员外部函数只能访问类的公有成员。但是在某些情况下需要在类的外部访问类的私有成员和保护成员。这时如果通过公有成员函数进行访问由于参数传递、类型检查和安全性检查等需要时间上的开销并影响程序的**运行效率**。为了解决这个问题引入友元。- **友元可以在类外部直接访问类的私有成员和保护成员提高程序的运行效率。**- 友元提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。对于一个类可以利用friend关键字将一般函数、其他类的成员函数或者是其他类声明为该类的友元使得这个类本来隐藏的信息包括私有成员或保护成员可以被友元所访问。- 如果友元是一般成员函数或者类的成员函数称为友元函数如果友元是一个类则成为友元类友元类的所有成员函数都被称为友元函数。- **友元函数** - 友元函数不是当前类的成员函数而是**独立于当前类的外部函数**包括普通函数和其他类的成员函数但它可以访问该类的所有成员包括私有成员、保护成员和公有成员。 - 友元函数要在类定义时声明声明时要在其函数名前加上**关键字friend**。 该声明可以放在**公有部分也可以放在私有部分和保护部分**。友元函数的定义通常在类外部。 例子#include using namespace std; class DATE{ public: DATE(int y2003,int m1,int d1):year(y),month(m),day(d){ } friend void DateTime(const DATE d,const TIME t);private: int year,month,day; }; void DateTime(const DATE d){ cout”Now is:”d.year”.”d.month”.”d.day”.”endl;} 12345678 由于采用friend将外部函数DateTime设置为DATE类友元函数所以这个函数能够直接访问类的成员变量。- **友元类** 友元类除了可以是函数外还可以是类即一个类可以作为另一个类的友元称为友元类。友元类的所有成员函数都是另一个类的友元函数都可以访问另一个类的所有成员函数和成员变量。 友元类的说明方法friend 类名 // 友元类类名 1234567## 对象数组- **定义**对象数组是指数组元素为对象的数组该数组的每一个元素都是同一个类的对象。- 对象数组定义的格式如下类名 数组名[大小]… 12- 使用对象数组成员的一般格式数组名[下标].成员名 成员对象定义类的数据成员可以是简单类型或自定义类型的变量也可以是类类型的对象。因此可以利用已定义的类来构造新的类使得一些复杂的类可以有一些简单的类组合而成。当类的数据成员为其他类的对象时这个对象被称为成员对象。 初始化当类中出现了成员对象时该类的构造函数要包含对成员对象的初始化成员对象的初始化工作也是在成员初始化列表中完成的。 构造顺序建了一个类的对象时要调用它的构造函数对类对象初始化此时应先执行初始化列表对各个成员进行初始化再执行当前类的构造函数体。如果类中包含有成员对象注意要根据初始化的参数调用成员对象的构造函数对其进行初始化。 成员对象初始化时根据初始化列表的特点可知类中有多个成员对象时要按照定义成员对象的顺序建立各个子对象即成员对象构造函数的执行顺序仅与成员对象在类中声明的顺序有关而与成员初始化列表中给出的成员对象的顺序无关。如果在构造函数的成员初始化列表中没有给出对成员对象的初始化则表示使用成员对象的默认构造函数如果成员对象所在的类没有默认构造函数将产生错误。 第七章 继承和派生概念继承是面向对象程序设计的一个重要特性是软件复用的一种形式它允许在原有类的基础上创建新的类。新类可以从一个或多个原有类中继承函数和数据并且可以重新定义或增加新的数据和函数从而形成类的层次或等级。 派生类与基类成员的访问派生类的构造函数和析构函数多继承和虚基类*子类型关系虚函数与多态性第八章 运算符重载运算符函数与运算符重载典型运算符的重载*运算符重载应注意的几个问题第九章 模板函数模板类模板第十章 C流C流的概念输入输出的格式控制文件流
http://www.zqtcl.cn/news/898178/

相关文章:

  • 公司制作网站做论坛网站怎么赚钱吗
  • 深圳 外贸 网站建设 龙医院网站建设价格
  • 网上建网站驰易网站建设
  • 建设工程招标专业网站网站联盟广告
  • 自建站英文公司网站制作银川
  • 顺德网站建设公司信息全网推广软件
  • 网站全屏视频怎么做电子商务网站规划的原则是什么
  • 网站建设行业发展史做网站主页上主要放哪些内容
  • 成都成华网站建设小程序开发网上商城
  • 企业网站建设的重要性和必要性深圳设计网站排行
  • 山西省网站建设河南省考生服务平台官网
  • 做水产的都用什么网站wordpress 前端登陆
  • 商务网站建设网站开发一个软件开发的流程
  • 网站建设电脑和手机有区别吗公众号登录微信入口
  • 天津市建设监理协会网站三亚网络网站建设
  • 义乌进货网平台北京网优化seo优化公司
  • 在网站上放广告网站建设流程效果
  • 腾讯云学生机做网站济南网站改版
  • 开封市做网站的公司wordpress无法映射
  • 网站构建工具wordpress 主题授权
  • 大型网站开发 赚钱宁夏网站建设优化
  • 通过ip访问网站需要怎么做博客的网站页面设计
  • 高明做网站软件开发工程师是前端还是后端
  • 利用html5 监控网站性能如何能快速搜到新做网站链接
  • 做网站需要看那几点seo是什么职业岗位
  • 做游戏网站需要哪些许可100个免费推广网站下载
  • 网站管理系统是什么马鞍山网站建设制作公司
  • 设计学网站网络工程专业毕业生设计
  • 成都网站建设有名的国外优质设计网站
  • seo基础培训教程seo百度关键词优化软件