已阅读5页,还剩92页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2019年6月10日,北京林业大学信息学院计算机系,算法与数据结构,Office: 基础楼201 Tel:62338372 E_mail:study_ ftp:lidongmei,李冬梅,2019年6月10日,北京林业大学信息学院计算机系,1、C+语言的概要 2、类、对象、构造函数与析构函数 3、输入/输出 4、函数、参数传递与函数返回值 5、函数名重载与操作符重载 6、动态存储分配 7、友元函数与内联函数 8、模板,c+程序设计语言,2019年6月10日,北京林业大学信息学院计算机系,1、C+语言概要,C+源于C语言。 1970年,两位程序员Brian Kernighan和Dennis Ritchie首创了一种新的程序设计语言,取名为C语言。 设计C语言的最初目的是编写操作系统。由于其简单、灵活的特点,C语言很快就被用于编写各种不同类型的程序,从而成为世界上最流行的语言之一。,2019年6月10日,北京林业大学信息学院计算机系,C 语言是一个面向过程的语言。随着软件开发技术的进步, 程序员们最终发现, 把数据和施加在其上的操作结合起来,会得到更易于理解的程序,由此产生了面向对象的程序设计思想。 1980年代初,美国 AT & T 贝尔实验室的Bjarne Stroustrup设计并实现了C语言的扩充、改进版本,C+语言诞生了! C+改进了C的不足之处,增加了对面向对象的程序设计的支持,在改进的同时,保持了C的简洁性和高效性。,2019年6月10日,北京林业大学信息学院计算机系,/一个简单的C+程序 /* 一个简单的C+程序,该程序在标准输出设备上输出一句问候语“hello” */ #include int main() cout “hello!“; return 0; /正常返回 这是一个只包含一个函数的程序,程序的基本元素是数据说明、函数和注释。,2019年6月10日,北京林业大学信息学院计算机系,注释,C+的第一次注释格式源于C语言。注释开始于“/*”,结束于“*/”,在两者之间的任何内容,包括换行符都被编译器忽略。 注意注释符对不可以嵌套。 另一种注释符以“/”开头,它是单行注释符,在它同一行右侧的任何信息都将被认为是注释而由编译器略去。 注意:上面两种注释符的两个标志符/和*,/和之间不可以分开。,2019年6月10日,北京林业大学信息学院计算机系,#include 命令,C+将一些标准函数和变量说明放在头文件中。头文件中保存所有与标准函数或变量相关的信息 如: #include 用户也可以定义自己的头文件,把一些相关的函数和变量组织在一个文件中,当另外的程序要用到这些函数和变量时,可以将该文件作为头文件include进来。 如:#include “complex.h”,2019年6月10日,北京林业大学信息学院计算机系,编译预处理命令,#include 包含指令 将一个源文件嵌入到当前源文件中该点处。 #include 按标准方式搜索,文件位于C+系统目录的include子目录下。这类文件一般是由系统给出的, 并已经过编译。 如: #include #include“文件名“ 首先在当前目录中搜索,若没有,再按标准方式搜索。这些头文件通常由用户自己给出 如:#include “complex.h” #define 宏定义指令 定义符号常量,已被const定义语句取代。 定义带参数宏,已被内联函数取代。 条件编译,2019年6月10日,北京林业大学信息学院计算机系,#if 常量表达式 程序段1 #else 程序段2 #endif /当“ 常量表达式”非零时编译程序段1,否则编译程序段2,条件编译,2019年6月10日,北京林业大学信息学院计算机系,#ifndef 标识符 程序段1 #else 程序段2 #endif /当“标识符”未经定义时编译程序段1,否则编译程序段2,条件编译,作用:由于文件包含可以嵌套使用,利用上述条件编译可避免多次重复包含一个头文件,以引起变量及类的重复定义,2019年6月10日,北京林业大学信息学院计算机系,/main.cpp #include “file1.h” #include “file2.h” void main(void) /file1.h #include “head.h” /file2.h #include “head.h” ,/head.h class p1 ,避免类p1重复定义,类p1重复定义,2019年6月10日,北京林业大学信息学院计算机系,下面的程序给出了典型的 C+ 程序结构,它是“Hello, world”程序的变型(教材P9) 这个程序由三个文件组成: hello.h(头文件) hello.cpp(源程序文件) main.cpp (源程序文件),/* File: hello.h */ #ifndef HEAD_H #define HEAD_H char *hello(char * ); #endif,包含 hello函数的原型。main函数可通过“# include”定向到该原型的定义文件,取得对原型的访问性。,C+的程序组成,2019年6月10日,北京林业大学信息学院计算机系,/* File: hello.cpp */ # include /*包括sprintf ( )的原型*/ # include /*包括strlen( )的原型*/ # include “hello.h” /*包括hello( )的原型*/ char *hello(char *name) char *value; /*返回串 “Hello, name.“. */ value = new char(9+strlen(name); sprintf (value, “Hello, %s.“, name); return value; ,hello函数的定义文件。它通过一个字符串类型的形式参数接受需要打印的串, 返回一个字符串类型的值作为打印串。返回类型必须与在#include定向的“.h”文件中所给出的原型的类型匹配。,2019年6月10日,北京林业大学信息学院计算机系,/* File: main.cpp */ # include # include “hello.h” void main(void) couthello(“world“); ,主程序,调用函数hello( ),2019年6月10日,北京林业大学信息学院计算机系,C+的数据声明将数据名与数据类型联系起来。其主要形式有: 常数值:如25, 13.4, “value is”, 它们的内容保持不变。 常量:数据声明时在变量名前冠以保留字const,如 const int MAX = 500, 可定义 一个常量。其内容在声明时给定,在声明它的程序运行时内容再赋值无效。 变量:数据类型的实例, 在程序执行时可以改变其内容。,C+的数据声明,2019年6月10日,北京林业大学信息学院计算机系,C+提供两大类数据类型:基本数据类型和复合数据类型。 基本数据类型有 5 种:整型(int)、浮点型(float)、字符型(char)、双精度浮点型(double)和无值(void)。 复合数据类型包括结构(struct)、联合(union)、位域、枚举(enum)、类(class)和用户自定义类型。 此外还有由基本数据类型和复合数据类型引申而来的数据类型,包括数组、指针、引用等。,2019年6月10日,北京林业大学信息学院计算机系,枚举:是声明一个整型常数序列的方式。 例如, 在程序开头做如下声明 enum Boolean FALSE, TRUE 则建立一个Boolean类型。FALSE, TRUE 都是Boolean类型整型常数, 默认值 0 和 1 指针:存放对象的存储地址,例如 int i = 5; int *np; /np为一个指向整型量的指针 np = /k中存入np所指地址i的内容,2019年6月10日,北京林业大学信息学院计算机系,指向数组的指针: void main(void) char *a=”hello”; char *b=”world”; for(;*a!=0;a+,b+) *b=*a; *b=0; ,while (*a) *b+=*a+;,2019年6月10日,北京林业大学信息学院计算机系,引用:它用来给一个对象提供一个替代的名字。例如 int i = 5; int 此时, j 是一个引用类型, 它代表 i 的一个替代名。当 i 的值改变时, j 的值也跟着改变。当 printf 语句执行后, 打印出的 i 和 j 的值都是7。,2019年6月10日,北京林业大学信息学院计算机系,在C+中, 每个变量都有一个作用域。区分一个变量时要同时考虑变量名及其作用域。 在函数定义中声明的变量, 仅能在该函数内部有效使用 在类定义中声明的变量, 仅能在该类内部有效使用 在一个段中声明的名字, 也仅能在该段及其子段中有效使用。,C+的作用域,2019年6月10日,北京林业大学信息学院计算机系,表达式是用来说明简单计算的。 C+中的表达式由操作数和操作符组成,它将操作符施加于操作数,最终得到一个结果。结果的数据类型由参加运算的数据类型决定。 a a + b * c + 200 2 * * R (x + y ) / (a b ) 其中操作符执行的先后顺序由它们的优先级和结合性决定。,表达式与操作符,2019年6月10日,北京林业大学信息学院计算机系,C+提供了很多预定义的操作符,程序员也可以重新定义这些操作符。 算术操作符:+、-、*、/、%。其中*、/、%优先于+、-。括号用来改变计算顺序。计算时,先计算括号内表达式的值,再将计算结果与括号外的数一起计算,如: 4 *(1 + 2)= 4 * 3 = 12 取模操作符(%)用于计算两整数相除后得到的余数,如:22 % 7 = 1。 注意,%只能用于整数相除,不能对浮点数操作。,2019年6月10日,北京林业大学信息学院计算机系,赋值操作符“ = ” 将其右侧的表达式求出结果, 赋给其左侧的变量。例如: int Value; Value = (2 + 3) * 4; 赋值表达式运算的结果是右运算元的值, 而结果类型是左运算元的数据类型, 例如: Value = 2.8 * 4 /结果为11, 而不是11.2 可以连续赋值, 但必须保证各运算元的类型相同。它的处理结果是每个运算元的对象值都为最右侧的运算元值,例如: int i, j; i = j = 0; / i, j都赋为0,2019年6月10日,北京林业大学信息学院计算机系,复合操作符: 加 a += b 等价于 a = a + b 减 a -= b 等价于 a = a - b 乘 a *= b 等价于 a = a * b 除 a /= b 等价于 a = a / b 取模 a %= b 等价于 a = a % b,2019年6月10日,北京林业大学信息学院计算机系,自增,自减操作符,自增(+), 自减(-) : a+ 等价于 a = a + 1 a- 等价于 a = a - 1 自增、自减符号既可位于变量的前面,也可位于变量的后面。前缀+表示先将其后的变量值增1,然后将增1后的变量参与表达式运算;而后缀+表示将其前面的变量先参与表达式运算,然后变量本身增1。 在单独作为一个表达式时,+a和a+效果一样,都是将变量a自增1。 自减操作符含义类似。,2019年6月10日,北京林业大学信息学院计算机系,条件操作符是C+中唯一的具有三个运算元的操作符,其形式为: 表达式1 ? 表达式2 : 表达式3 它的运算方式为: 先计算表达式1的值, 如果其值为非零 (true),则表达式2的值就是整个表达式的最终结果, 否则表达式3的值就是整个表达式的值。,2019年6月10日,北京林业大学信息学院计算机系,语句是C+程序中最小的可执行单元。一条语句由一个分号结束。 语句可以是简单语句,也可以是复杂语句。 int radius; 是声明语句; circum = 2 * PI * radius; 是表达式语句; 它由一个表达式后接一个分号形成。 cout Value; 这是简单语句。这些语句告知计算机该如何定义变量以及如何执行程序。,语句,2019年6月10日,北京林业大学信息学院计算机系,除简单语句外,C+还定义了一些可以控制程序执行流程的语句, 这些语句提供对控制流的分支和循环功能。 C+中, 语句缺省都是顺序执行, 如果碰到分支或循环语句, 顺序执行的规则就要改变。此外,C+中还有一些跳转语句。 有时还有一些语句需要合在一起作为语法结构中的一条语句,这时需要将这些语句用大括号括起来,形成一个复合语句,复合语句不需要以分号终结。,2019年6月10日,北京林业大学信息学院计算机系,if 语句的一般格式为: if ( 条件表达式 ) 语句; 如果条件表达式的结果为true (非零值),则执行语句语句,否则跳过这段语句。 语句可以有多条, 这时需用大括号 将这些语句括起来, 形成一条复合语句。 if (条件表达式) 语句1; 语句2; ,if 语句 (二分支选择型),2019年6月10日,北京林业大学信息学院计算机系,如果希望在条件满足和不满足时分别执行不同语句,则用 else 引入条件不满足时的语句: if (条件表达式) 语句1; else 语句2; 语句1,语句2也可以是复合语句,不过这时的语句不需以分号结尾。 语句1、语句2中又可以出现 if 语句,所以 if 语句可以嵌套,不过这时容易带来语义的歧义性。,2019年6月10日,北京林业大学信息学院计算机系,例 if ( ch = 0 ) if ( ch = 9 ) cout “这是一个数字!”; else cout “这不是一个数字!”;,else总是与最后一个出现的还没有else与之匹配的if匹配,如果 想让它与第一个if匹配,可以用大括号将不与else匹配的if语句括起来,使之成为复合语句。,2019年6月10日,北京林业大学信息学院计算机系,if ( ch = 0 ) if ( ch = 9 ) cout “这是一个数字!”; else cout “这不是一个数字!”;,2019年6月10日,北京林业大学信息学院计算机系,switch语句用于有多重选择的场合, 形式为 switch (表达式) case 值1: 语句组; break; /break可没有 case 值2: 语句组; break; /break可没有 case 值n: 语句组; break; /break可没有 default: 语句组; ; 注意case后的数值必须是一个整型的常量表达式,且任意两个选择项不能相等。,switch 语句 (多分支选择型),2019年6月10日,北京林业大学信息学院计算机系,当switch语句执行时, 先计算其后的表达式值, 将表达式的值与后面各 case 关键字后所跟选择常量依次比较。 如果与某一选择常量相等,则执行其冒号后跟的语句。如果和任何选择常量都不等, 则执行 default 子句后的语句(如果 default子句存在)或什么也不做(如果 default 子句不存在)。 每个case子句都以break语句结束。break子句的作用是终止当前switch语句的执行。,2019年6月10日,北京林业大学信息学院计算机系,例: 统计文章中各字母出现的次数。程序每读入一个字符ch, 根据它的值, 将相应的计数值增1, 假定英文大小写不区分。 int aCnt = 0 , bCnt = 0 , , zCnt = 0; switch (ch) case a: case A: aCnt+; break; case b: case B: bCnt+; break; / case z: case Z: zCnt+; break; ,2019年6月10日,北京林业大学信息学院计算机系,循环语句提供重复处理的能力, 当某一特定条件为 true 时, 循环语句就重复执行, 并且每循环一次, 就会测试一下循环条件, 如果为 false, 则循环结束, 否则继续循环。 C+支持三种格式的循环语句:while、 do while和 for 语句。三者可以完成类似的功能,不同的是它们控制循环的方式。,循环语句,2019年6月10日,北京林业大学信息学院计算机系,while 语句的一般形式为: while (条件表达式) 循环体语句 while 循环先计算条件表达式, 当条件表达式的运算结果为 true 时, 就执行循环体语句。执行一次循环体语句后, 就会重新计算条件表达式, 当表达式的值为 false 时,循环结束。 while 循环可能一次也不执行。,while 语句 (先判断后执行),2019年6月10日,北京林业大学信息学院计算机系,do语句的一般形式为: do 循环体语句 while (条件表达式); do 语句先执行循环体语句, 然后计算条件表达式是否为 true, 如果是, 则继续执行循环, 否则结束循环。 与 while 语句不同的是,do 循环中的循环体语句至少执行一次, 而while语句当条件第一次不满足时循环体语句一次也不执行。,do while 语句 (先执行后判断),2019年6月10日,北京林业大学信息学院计算机系,for 语句用于预先知道循环次数的情况, 其一般形式为: for ( 初始化语句; 表达式1; 表达式2 ) 循环体语句; 其中初始化语句可以是一条声明或表达式,用于对循环控制变量进行初始化或赋值。 表达式 1 用于控制循环结束, 当它的值为 true 时, 继续循环, 为false时终止循环。 表达式 2 在每次循环执行后改变循环控制变量的值。,for 语句,2019年6月10日,北京林业大学信息学院计算机系,具体来说,for循环的执行过程为: 执行初始化语句; 计算表达式 1的值; 如果表达式 1的值为true: 先执行循环体语句; 再执行表达式2; 然后转向步骤; 如果表达式1的值为false, 则结束循环。,2019年6月10日,北京林业大学信息学院计算机系,i=1; do sum=sum+i; i+; while (i=100),i=1;while (i=100)sum=sum+i;i+; ,for(i=1;i=100;i+)sum=sum+i;,求1到100之间所有数的和,2019年6月10日,北京林业大学信息学院计算机系,除了顺序执行和分支、循环外, 有时需要中断一段程序的执行, 跳转到其它地方继续执行, 这时需用到跳转语句。 跳转语句包括break、continue和goto语句,跳转语句,2019年6月10日,北京林业大学信息学院计算机系,break语句 终止switch语句的执行 switch(grade) case a: case A: aCnt+; break; 终止循环,跳出当前循环体 for (r=1; r100)break; /面积100终止循环 printf (”%f”,area);,break语句和continue语句,2019年6月10日,北京林业大学信息学院计算机系,continue语句 作用:结束本次循环,接着进行下一次是否执行循环的判定 与break的区别 break:终止整个循环,跳出循环体 continue:终止本次循环,2019年6月10日,北京林业大学信息学院计算机系,2、类、对象、构造函数与析构函数,类是C+的核心 类定义的一般形式为: class 类名 private: 数据成员或成员函数 protected: 数据成员或成员函数 public: 数据成员或成员函数 ; ,/不允许该类的派生类访问,/允许该类的派生类访问,/其它类的对象或操作可以访问,2019年6月10日,北京林业大学信息学院计算机系,#ifndef _complex_h #define _complex_h #include class comlex public: complex ( ) Re = Im = 0; /不带参数的构造函数 complex ( double r, double i ) Re = r; Im = i; /分别置实部、虚部的构造函数 double getReal ( ) return Re; /取复数实部 double getImag ( ) return Im; /取复数虚部 complex complex: operator + ( complex #endif,试用C+的类声明定义“复数”的抽象数据类型,2019年6月10日,北京林业大学信息学院计算机系,建立类的对象(亦称为实例化)时采用的方式类似于定义C变量的方式 complex c1 (6, 3),c2(4,8); complex c3; c1、c2和c3都是complex 类的对象。,C+的对象,2019年6月10日,北京林业大学信息学院计算机系,构造函数(constructor)的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。它属于名字相同的类。 在对象创建时由系统自动调用。 如果程序中未声明,则系统自动产生出一个缺省形式的构造函数,构造函数,complex ( ) Re = Im = 0; /不带参数的构造函数 complex ( double r, double i ) Re = r; Im = i; /分别置实部、虚部的构造函数 ,也可写成: complex ( double r, double i ) : Re(r),Im(i) ,2019年6月10日,北京林业大学信息学院计算机系,对于 complex c1 (6, 3); 有 Re =r = 6, Im =i = 3 对于complex c1; 有 Re = Im = 0,2019年6月10日,北京林业大学信息学院计算机系,当要放弃对象时, 需隐式地调用另一个函数,叫做析构(destructor)函数, 它属于名字相同的类, 但在名字前面加上了一个“”。如:complex( ) 为一个类可定义几个构造函数,但只能定义 一个析构函数。当要退出变量的作用域时, 或当通过 delete 命令释放一个动态分配的变量时, 就要调用析构函数。,析构函数,2019年6月10日,北京林业大学信息学院计算机系,在 struct 中,缺省的访问级别是 public 在 class 中, 缺省的访问级别是 private,结构(struct)与类的区别,class Rectangle int x1, y1, h, w; public: Rectangle ( ); Rectangle ( ); int GetX ( ); int GetY ( ); void SetX (int x); void SetY (int y); int GetHeight ( ); int GetWidth ( ); ,struct Rectangle Rectangle ( ); Rectangle ( ); int GetX ( ); int GetY ( ); void SetX (int x); void SetY (int y); int GetHeight ( ); int GetWidth ( ); private: int x1, y1, h, w; ,2019年6月10日,北京林业大学信息学院计算机系,在 union 中,缺省的访问级别是 public 所有的数据成员共享相同的存储地址,节省存储空间,联合(union)与类的区别,stuct int num; char name10; char sex; char job; union int class; char position10; category; person100;,2019年6月10日,北京林业大学信息学院计算机系,在C+中执行输入/输出操作, 需用#include预处理指令包括一个头文件。用它可支持C+的流(stream)操作。 “流”是个简单的字符序列。在C+中有两个预定义的类istream和ostream,它们定义了输入流和输出流。 基本输入/输出方式: 键盘屏幕输入/输出 文件输入/输出,3、 C+的输入/输出,2019年6月10日,北京林业大学信息学院计算机系,在C+中用cin,cout和cerr来定义键盘输入类、屏幕输出类和错误信息输出类。 操作符 用于读入类istream的一个对象。,键盘屏幕输入/输出,2019年6月10日,北京林业大学信息学院计算机系,在下面程序中使用了流 cin ,相继从标准输入设备上输入两个整型变量a和b, 并将它们打印到标准输出设备上。 在输出语句中最后输出的endl是C+的I/O操作符, 它的用途是输出一个换行符并清空流。,#include void main ( ) int a, b; cin a b; cout “a :” a “b :” b endl; ,2019年6月10日,北京林业大学信息学院计算机系,C+中的输入/输出可以是自由格式,程序员不需要使用格式化符号来指定输入/输出项的类型和顺序。 与其它C+操作符一样,输入/输出操作符能够被重载。,2019年6月10日,北京林业大学信息学院计算机系,在程序开头必须用预处理指令#include包含头文件,它定义了类ifstream、ofstream和fstream。 要创建一个输入流, 必须声明它为ifstream类的实例 要创建一个输出流, 必须声明它为ofstream类实例,文件输入/输出,2019年6月10日,北京林业大学信息学院计算机系,#include #include #include void main ( ) ofstream outFile(“my.txt“, ios:out); / outFile为输出流对象,建立输出文件my.txt if(!outFile) cerr name num; coutnameendlnumendl;,2019年6月10日,北京林业大学信息学院计算机系,在C+中有两种函数: 常规函数和成员函数 不论哪种函数, 其定义都包括 4 个部分: 函数名、形式参数表、返回类型和函数体。 函数的使用者通过函数名来调用该函数;调用时把实际参数传送给形式参数表作为数据的输入;通过函数体中的处理程序实现该函数的功能;最后得到返回值作为输出。,3、函数、参数传递与函数返回值,C+的函数,2019年6月10日,北京林业大学信息学院计算机系,下面给出一个函数的例子。max是函数名, int a 和 int b 是形式参数表, 函数名前面的int 是返回类型, 在花括号内括起来的是函数体, 它给出了函数操作的实现。 int max ( int a, int b ) /函数返回 a 与 b 中的大值 if (a b) return a; else return b; ,2019年6月10日,北京林业大学信息学院计算机系,return 的作用是返回一个与返回类型相同类型的值,并中止函数的执行。 void :函数无返回值,2019年6月10日,北京林业大学信息学院计算机系,函数调用时传送给形参表的实参必须与形参在类型、个数、顺序上保持一致 参数传递有两种方式 传值(缺省) 引用类型。,C+中的参数传递,2019年6月10日,北京林业大学信息学院计算机系,void main() float a,b; cinab; swap(a,b); coutaendlbendl; ,#include void swap(float m,float n) float temp; temp=m; m=n; n=temp; ,使用传值方式时,把实参的值传送给函数局部工作区相应的副本中,函数使用这个副本执行必要的功能。这样,函数修改的是副本的值,实参的值不变。,2019年6月10日,北京林业大学信息学院计算机系,数组名作形参,#include void sub(char); void main(void ) char a10=“hello”; sub(a); coutaendl; void sub(char b ) b =“world”;,数组名做形参,传递的是数组的首地址, 对形参数组所做的任何改变都将反映到实参数组中,2019年6月10日,北京林业大学信息学院计算机系,#include #define N 10 int max(int a); void main ( ) int a10; int i,m; for(i=0;iai; m=max(a); cout“the max number is:“m; ,int max(int b) int i,n; n=b0; for(i=1;iN;i+) if(nbi) n=bi; return n; ,用数组作函数的参数,求10个整数的最大数,2019年6月10日,北京林业大学信息学院计算机系,练习:用数组作为函数的参数,将数组中n个整数按相反的顺序存放,要求输入和输出在主函数中完成,#include #define N 10 void sub(int b ) int i,j,temp,m; m=(N-1)/2; for(i=0;i=m;i+) j=N-1-i; temp=bi; bi= bj; bj=temp; return ;,void main ( ) int a10,i; for(i=0;iai; sub(a); for(i=0;iN;i+) coutai; ,2019年6月10日,北京林业大学信息学院计算机系,#include void swap (int /不需要加 * ,引用类型作形参,2019年6月10日,北京林业大学信息学院计算机系,(1)传递引用给函数与传递指针的效果是一样的,形参变化实参也发生变化。 (2)引用类型作形参,在内存中并没有产生实参的副本,它直接对实参操作;而一般变量作参数,形参与实参就占用不同的存储单元,所以形参变量的值是实参变量的副本。因此,当参数传递的数据量较大时,用引用比用一般变量传递参数的时间和空间效率都好。 (3)指针参数虽然也能达到与使用引用的效果,但在被调函数中需要重复使用“*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。,引用类型作形参的几点说明,2019年6月10日,北京林业大学信息学院计算机系,#include void display(const double ,常值引用作形参,常引用做形参,在函数中不能更新r所引用的对象, 对应的实参不会被破坏,2019年6月10日,北京林业大学信息学院计算机系,若传送的值参是一个对象 (作为类的实例) 时, 在函数中就创建了该对象的一个副本,调用拷贝构造函数,在函数结束前要调用该副本的析构函数撤消这个副本。 若采用引用方式传递对象,在函数中不创建该对象的副本,也不存在最后撤消副本的问题。但是,通过引用传递的是对象时,函数对对象的改变将影响调用的对象。,对象作形参,2019年6月10日,北京林业大学信息学院计算机系,#include class Temperature private: float highTemp, lowTemp; /数据成员 public: Temperature(int hi, int lo) /构造函数 highTemp = hi; lowTemp = lo; void UpdateTemp(float temp); /普通成员函数 float GetHighTemp( ) const; /常成员函数 ;,普通成员函数允许改变该对象的私有数据成员 常成员函数不能改变该对象的私有成员 类型说明符 函数名(参数表)const;,成员函数的返回值,2019年6月10日,北京林业大学信息学院计算机系,void Temperature : UpdateTemp(float temp) if (temp highTemp) highTemp = temp; if (temp LowTemp) LowTemp = temp; float Temperature : GetHighTemp( ) const return highTemp; void main(void ) Temperature t1(25,4); const Temperature t2(30,2); /常对象,必须初始化不能更新 t1. UpdateTemp( 10); t2. UpdateTemp( 10) ;/错误,常对象只能调用其常成员函数 t2. GetHighTemp( ) ; /正确,2019年6月10日,北京林业大学信息学院计算机系,当成员函数的返回值为引用方式时, 该成员函数的返回值应是一个已存在变量(或对象)的别名。当该成员函数被重新赋值时, 其对应变量(或对象)的值将改变。,目的: 在内存中不产生被返回值的副本 为了将该函数用在赋值运算符的左边,改变其对应变量(或对象)的值 使用方法:在函数类型后加上 “&”,返回引用类型的函数,2019年6月10日,北京林业大学信息学院计算机系,#include char /返回一个字符的引用类型,该函数的返回值是sm的别名,返回引用类型的函数,2019年6月10日,北京林业大学信息学院计算机系,函数名重载,函数名相同,形参或返回类型不同,5、重载,#include void whatitis(int i) cout“this is integer“iendl; void whatitis(char c) cout“this is string”cendl; main() int i=1; char c=“abcdef“; whatitis(i); whatitis(c);,2019年6月10日,北京林业大学信息学院计算机系,运算符重载,运算符重载是一种特殊的函数重载 类型名 operator(形参表) 其中,operator是关键字,是运算符,#include class complex public: complex ( ) Re = Im = 0; /不带参数的构造函数 private: double Re, Im; /复数的实部与虚部; complex complex : operator + ( complex ,void main( ) complex c1 (6, 3),c2(4,8),c3; c3=c1+c2 ,/c3=c1.operator+(c2),2019年6月10日,北京林业大学信息学院计算机系,6、动态存储分配,new 类型名T(初值列表) 功能: 申请用于存放T类型对象的内存空间,并依初值列表赋以初值 结果值: 成功:T类型的指针,指向新分配的内存 失败:0(NULL),int *p1= new int; 或 int *p1 = new int(10);,delete 指针P 功能: 释放指针P所指向的内存。P必须是new操作的返回值,delete p1;,2019年6月10日,北京林业大学信息学院计算机系,用new创建数组: new 类型名T下标表达式;,int *p2= new int10;/p2指向数组的首地址,2019年6月10日,北京林业大学信息学院计算机系,友元函数不是该类的成员函数,它可以是一个常规函数,也可以是另一个类的成员函数 友元函数可以存取类的私有成员和保护成员,7、友元(friend)函数和内联(inline)函数,2019年6月10日,北京林业大学信息学院计算机系,友元函数的定义和使用方法 #include “iostream.h” class X1() private: int x; public: X1(int i) x=i; int getx(); friend void sum(X1 ,2019年6月10日,北京林业大学信息学院计算机系,void sum(X1 ,2019年6月10日,北京林业大学信息学院计算机系,friend ostream ,class comlex public: complex ( ) Re = Im = 0; friend ostream,2019年6月10日,北京林业大学信息学院计算机系,内联函数 声明时使用关键字 inline 编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销,#include inline double CalArea(double radius) return 3.14*radius*radius; int main( ) double r(3.0); double area; area=CalArea(r); /编译上行被替换CalArea函数体语句 coutareaendl; return 0; ,2019年6月10日,北京林业大学信息学院计算机系,模板就是使程序能够对不同类型的数据进行相同方式的处理 C+中的模板分为函数模板和类模板,8、模板 (template),函数模板的作用: 函数模板可以用来创建一个通用功能的函数,使得函数的某些参数、函数的返回值,能取任意类型,以支持多种不同形参,进一步简化重载函数的函数体设计 声明方法: template 函数声明,2019年6月10日,北京林业大学信息学院计算机系,#include template T abs(T x) return x0?-x:x; void main( ) int n=-5; double d=-5.5; coutabs(n)endl; coutabs(d)endl; ,运行结果: 5 5.5,编译器从调用abs( )时实参的类型,推导出函数模板的类型参数。例如,对于调用表达式abs(n),由于实参n为int型,所以推导出模板中类型参数T为int。 当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数: int abs(int x) return x0?-x:x; ,函数模板,2019年6月10日,北京林业大学信息学院计算机系,类模板的作用 类模板为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型 类模板的声明方法: template 类声明,类模板,2019年6月10日,北京林业大学信息学院计算机系,模板参数表: class 标识符(指明可以接受一个类型参数) 类型说明符 标识符(指明可以接受一个由“类型说明符”所规定类型的常量作为参数) 当参数有多个时,需用逗号隔开。,类模板的声明方法: template 类声明,template class A1 A1 x;,template class A2 A2 y;,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 遮蔽剂调制与涂布工安全知识宣贯竞赛考核试卷含答案
- 煤气净化回收工操作安全测试考核试卷含答案
- 导猎员风险识别竞赛考核试卷含答案
- 模压成型工职业健康技术规程
- 解析领导力影响力
- 教育学论文深度解析
- 教育光芒介绍
- 广东省珠海市2025-2026学年七年级上学期期中数学模拟试卷(含解析)
- 特训02 一元二次方程根与系数的关系通关专练-2025-2026学年九年级数学上学期期中期末挑战满分冲刺卷(人教版)(解析版)
- 第三章 概率的进一步认识(单元测试-基础卷)-北师大版九年级数学上册(附答案)
- DB41-T 2886-2025 矿产地质勘查规范 花岗伟晶岩型高纯石英矿
- 金融从业人员心理健康及其干预策略的研究报告
- 《航空航天复合材料》全套教学课件
- 建筑公司项目部零星辅材管理制度
- 2025-2030年中国成人教育行业市场深度调研及竞争格局与投资研究报告
- 中建海外管理制度
- 毕业设计(论文)-汽车后视镜机械结构设计
- ERP系统操作教程erp系统教程
- CJ/T 474-2015城镇供水管理信息系统供水水质指标分类与编码
- 2025年行政事业单位内部控制规范竞赛题
- 初中生必背古诗文61首-带拼音带分隔符
评论
0/150
提交评论