c++程序设计语言_第1页
c++程序设计语言_第2页
c++程序设计语言_第3页
c++程序设计语言_第4页
c++程序设计语言_第5页
已阅读5页,还剩92页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Office: 基础楼201Tel:62338372E_mail:study_ftp:lidongmei李冬梅 Friday, August 12, 2022 北京林业大学信息学院计算机系1、C+语言的概要2、类、对象、构造函数与析构函数3、输入/输出4、函数、参数传递与函数返回值5、函数名重载与操作符重载6、动态存储分配7、友元函数与内联函数8、模板c+程序设计语言 Friday, August 12, 2022 北京林业大学信息学院计算机系1、C+语言概要C+源于C语言。1970年,两位程序员Brian Kernighan和Dennis Ritchie首创了一种新的程序设计语言,取名为C语

2、言。设计C语言的最初目的是编写操作系统。由于其简单、灵活的特点,C语言很快就被用于编写各种不同类型的程序,从而成为世界上最流行的语言之一。 Friday, August 12, 2022 北京林业大学信息学院计算机系C 语言是一个面向过程的语言。随着软件开发技术的进步, 程序员们最终发现, 把数据和施加在其上的操作结合起来,会得到更易于理解的程序,由此产生了面向对象的程序设计思想。1980年代初,美国 AT & T 贝尔实验室的Bjarne Stroustrup设计并实现了C语言的扩充、改进版本,C+语言诞生了!C+改进了C的不足之处,增加了对面向对象的程序设计的支持,在改进的同时,保持了C的

3、简洁性和高效性。 Friday, August 12, 2022 北京林业大学信息学院计算机系/一个简单的C+程序/* 一个简单的C+程序,该程序在标准输出设备上输出一句问候语“hello” */#include int main() cout hello!;return 0;/正常返回这是一个只包含一个函数的程序,程序的基本元素是数据说明、函数和注释。 Friday, August 12, 2022 北京林业大学信息学院计算机系注释C+的第一次注释格式源于C语言。注释开始于“/*”,结束于“*/”,在两者之间的任何内容,包括换行符都被编译器忽略。注意注释符对不可以嵌套。另一种注释符以“/”开

4、头,它是单行注释符,在它同一行右侧的任何信息都将被认为是注释而由编译器略去。注意:上面两种注释符的两个标志符/和*,/和之间不可以分开。 Friday, August 12, 2022 北京林业大学信息学院计算机系#include 命令C+将一些标准函数和变量说明放在头文件中。头文件中保存所有与标准函数或变量相关的信息如: #include 用户也可以定义自己的头文件,把一些相关的函数和变量组织在一个文件中,当另外的程序要用到这些函数和变量时,可以将该文件作为头文件include进来。如:#include “complex.h” Friday, August 12, 2022 北京林业大学信息

5、学院计算机系编译预处理命令#include 包含指令将一个源文件嵌入到当前源文件中该点处。#include 按标准方式搜索,文件位于C+系统目录的include子目录下。这类文件一般是由系统给出的, 并已经过编译。如: #include #include文件名首先在当前目录中搜索,若没有,再按标准方式搜索。这些头文件通常由用户自己给出如:#include “complex.h” #define 宏定义指令定义符号常量,已被const定义语句取代。定义带参数宏,已被内联函数取代。条件编译 Friday, August 12, 2022 北京林业大学信息学院计算机系 #if 常量表达式程序段1#e

6、lse程序段2#endif/当“ 常量表达式”非零时编译程序段1,否则编译程序段2条件编译 Friday, August 12, 2022 北京林业大学信息学院计算机系 #ifndef 标识符程序段1#else程序段2#endif/当“标识符”未经定义时编译程序段1,否则编译程序段2条件编译作用:由于文件包含可以嵌套使用,利用上述条件编译可避免多次重复包含一个头文件,以引起变量及类的重复定义 Friday, August 12, 2022 北京林业大学信息学院计算机系/main.cpp#include “file1.h” #include “file2.h” void main(void) /

7、file1.h#include “head.h” /file2.h#include “head.h” /head.hclass p1 /head.h#ifndef HEAD_H #define HEAD_H class p1 #endif避免类p1重复定义类p1重复定义 Friday, August 12, 2022 北京林业大学信息学院计算机系下面的程序给出了典型的 C+ 程序结构,它是“Hello, world”程序的变型(教材P9)这个程序由三个文件组成:hello.h(头文件)hello.cpp(源程序文件)main.cpp (源程序文件) /* File: hello.h */ #i

8、fndef HEAD_H #define HEAD_Hchar *hello(char * ); #endif包含 hello函数的原型。main函数可通过“# include”定向到该原型的定义文件,取得对原型的访问性。C+的程序组成 Friday, August 12, 2022 北京林业大学信息学院计算机系/* File: hello.cpp */ # include /*包括sprintf ( )的原型*/ # include /*包括strlen( )的原型*/ # include “hello.h” /*包括hello( )的原型*/ char *hello(char *name)

9、 char *value;/*返回串 Hello, name. */ value = new char(9+strlen(name); sprintf (value, Hello, %s., name); return value;hello函数的定义文件。它通过一个字符串类型的形式参数接受需要打印的串, 返回一个字符串类型的值作为打印串。返回类型必须与在#include定向的“.h”文件中所给出的原型的类型匹配。 Friday, August 12, 2022 北京林业大学信息学院计算机系/* File: main.cpp */# include # include “hello.h” vo

10、id main(void) couthello(world);主程序,调用函数hello( ) Friday, August 12, 2022 北京林业大学信息学院计算机系C+的数据声明将数据名与数据类型联系起来。其主要形式有: 常数值:如25, 13.4, “value is”, 它们的内容保持不变。常量:数据声明时在变量名前冠以保留字const,如 const int MAX = 500, 可定义 一个常量。其内容在声明时给定,在声明它的程序运行时内容再赋值无效。变量:数据类型的实例, 在程序执行时可以改变其内容。 C+的数据声明 Friday, August 12, 2022 北京林业大

11、学信息学院计算机系C+提供两大类数据类型:基本数据类型和复合数据类型。基本数据类型有 5 种:整型(int)、浮点型(float)、字符型(char)、双精度浮点型(double)和无值(void)。复合数据类型包括结构(struct)、联合(union)、位域、枚举(enum)、类(class)和用户自定义类型。此外还有由基本数据类型和复合数据类型引申而来的数据类型,包括数组、指针、引用等。 Friday, August 12, 2022 北京林业大学信息学院计算机系枚举:是声明一个整型常数序列的方式。例如, 在程序开头做如下声明 enum Boolean FALSE, TRUE 则建立一个

12、Boolean类型。FALSE, TRUE 都是Boolean类型整型常数, 默认值 0 和 1 指针:存放对象的存储地址,例如 int i = 5; int *np; /np为一个指向整型量的指针 np = &i; /把整型变量 i 的地址赋给它 /np 成为指向整型变量 i 的指针 int k = *np; /k中存入np所指地址i的内容 Friday, August 12, 2022 北京林业大学信息学院计算机系指向数组的指针:void main(void) char *a=”hello”; char *b=”world”; for(;*a!=0;a+,b+) *b=*a; *b=0;w

13、hile (*a) *b+=*a+; Friday, August 12, 2022 北京林业大学信息学院计算机系引用:它用来给一个对象提供一个替代的名字。例如 int i = 5; int& j = i; i = 7; cout“i =”i“ j” j ; 此时, j 是一个引用类型, 它代表 i 的一个替代名。当 i 的值改变时, j 的值也跟着改变。当 printf 语句执行后, 打印出的 i 和 j 的值都是7。 Friday, August 12, 2022 北京林业大学信息学院计算机系在C+中, 每个变量都有一个作用域。区分一个变量时要同时考虑变量名及其作用域。在函数定义中声明的变

14、量, 仅能在该函数内部有效使用在类定义中声明的变量, 仅能在该类内部有效使用在一个段中声明的名字, 也仅能在该段及其子段中有效使用。C+的作用域 Friday, August 12, 2022 北京林业大学信息学院计算机系表达式是用来说明简单计算的。C+中的表达式由操作数和操作符组成,它将操作符施加于操作数,最终得到一个结果。结果的数据类型由参加运算的数据类型决定。 a a + b * c + 200 2 * * R (x + y ) / (a b ) 其中操作符执行的先后顺序由它们的优先级和结合性决定。表达式与操作符 Friday, August 12, 2022 北京林业大学信息学院计算机

15、系C+提供了很多预定义的操作符,程序员也可以重新定义这些操作符。算术操作符:+、-、*、/、%。其中*、/、%优先于+、-。括号用来改变计算顺序。计算时,先计算括号内表达式的值,再将计算结果与括号外的数一起计算,如: 4 *(1 + 2)= 4 * 3 = 12取模操作符(%)用于计算两整数相除后得到的余数,如:22 % 7 = 1。注意,%只能用于整数相除,不能对浮点数操作。 Friday, August 12, 2022 北京林业大学信息学院计算机系赋值操作符“ = ” 将其右侧的表达式求出结果, 赋给其左侧的变量。例如: int Value; Value = (2 + 3) * 4;赋值

16、表达式运算的结果是右运算元的值, 而结果类型是左运算元的数据类型, 例如: Value = 2.8 * 4 /结果为11, 而不是11.2可以连续赋值, 但必须保证各运算元的类型相同。它的处理结果是每个运算元的对象值都为最右侧的运算元值,例如: int i, j; i = j = 0; / i, j都赋为0 Friday, August 12, 2022 北京林业大学信息学院计算机系复合操作符:加a += b 等价于a = a + b减 a -= b 等价于a = a - b乘a *= b 等价于a = a * b除 a /= b 等价于a = a / b取模 a %= b 等价于a = a

17、% b Friday, August 12, 2022 北京林业大学信息学院计算机系自增,自减操作符自增(+), 自减(-) : a+ 等价于 a = a + 1 a-等价于 a = a - 1自增、自减符号既可位于变量的前面,也可位于变量的后面。前缀+表示先将其后的变量值增1,然后将增1后的变量参与表达式运算;而后缀+表示将其前面的变量先参与表达式运算,然后变量本身增1。 在单独作为一个表达式时,+a和a+效果一样,都是将变量a自增1。自减操作符含义类似。 Friday, August 12, 2022 北京林业大学信息学院计算机系条件操作符是C+中唯一的具有三个运算元的操作符,其形式为:

18、表达式1 ? 表达式2 : 表达式3它的运算方式为: 先计算表达式1的值, 如果其值为非零 (true),则表达式2的值就是整个表达式的最终结果, 否则表达式3的值就是整个表达式的值。 Friday, August 12, 2022 北京林业大学信息学院计算机系语句是C+程序中最小的可执行单元。一条语句由一个分号结束。语句可以是简单语句,也可以是复杂语句。 int radius; 是声明语句; circum = 2 * PI * radius; 是表达式语句; 它由一个表达式后接一个分号形成。 cout Value;这是简单语句。这些语句告知计算机该如何定义变量以及如何执行程序。语句 Frid

19、ay, August 12, 2022 北京林业大学信息学院计算机系除简单语句外,C+还定义了一些可以控制程序执行流程的语句, 这些语句提供对控制流的分支和循环功能。C+中, 语句缺省都是顺序执行, 如果碰到分支或循环语句, 顺序执行的规则就要改变。此外,C+中还有一些跳转语句。有时还有一些语句需要合在一起作为语法结构中的一条语句,这时需要将这些语句用大括号括起来,形成一个复合语句,复合语句不需要以分号终结。 Friday, August 12, 2022 北京林业大学信息学院计算机系if 语句的一般格式为: if ( 条件表达式 ) 语句;如果条件表达式的结果为true (非零值),则执行语

20、句语句,否则跳过这段语句。语句可以有多条, 这时需用大括号 将这些语句括起来, 形成一条复合语句。 if (条件表达式) 语句1; 语句2; if 语句 (二分支选择型) Friday, August 12, 2022 北京林业大学信息学院计算机系如果希望在条件满足和不满足时分别执行不同语句,则用 else 引入条件不满足时的语句: if (条件表达式) 语句1; else 语句2;语句1,语句2也可以是复合语句,不过这时的语句不需以分号结尾。语句1、语句2中又可以出现 if 语句,所以 if 语句可以嵌套,不过这时容易带来语义的歧义性。 Friday, August 12, 2022 北京林

21、业大学信息学院计算机系例 if ( ch = 0 ) if ( ch = 9 ) cout “这是一个数字!”; else cout = 0 ) if ( ch = 9 ) cout “这是一个数字!”; else cout “这不是一个数字!”; Friday, August 12, 2022 北京林业大学信息学院计算机系switch语句用于有多重选择的场合, 形式为 switch (表达式) case 值1: 语句组; break; /break可没有 case 值2: 语句组; break; /break可没有 case 值n: 语句组; break; /break可没有 default

22、: 语句组; ;注意case后的数值必须是一个整型的常量表达式,且任意两个选择项不能相等。switch 语句 (多分支选择型) Friday, August 12, 2022 北京林业大学信息学院计算机系当switch语句执行时, 先计算其后的表达式值, 将表达式的值与后面各 case 关键字后所跟选择常量依次比较。如果与某一选择常量相等,则执行其冒号后跟的语句。如果和任何选择常量都不等, 则执行 default 子句后的语句(如果 default子句存在)或什么也不做(如果 default 子句不存在)。每个case子句都以break语句结束。break子句的作用是终止当前switch语句的

23、执行。 Friday, August 12, 2022 北京林业大学信息学院计算机系例: 统计文章中各字母出现的次数。程序每读入一个字符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; Friday, August 12, 2022 北京林业大学信息学院计算机系循环语句提供重复处理的能力, 当某一特定

24、条件为 true 时, 循环语句就重复执行, 并且每循环一次, 就会测试一下循环条件, 如果为 false, 则循环结束, 否则继续循环。C+支持三种格式的循环语句:while、 do while和 for 语句。三者可以完成类似的功能,不同的是它们控制循环的方式。循环语句 Friday, August 12, 2022 北京林业大学信息学院计算机系while 语句的一般形式为: while (条件表达式) 循环体语句 while 循环先计算条件表达式, 当条件表达式的运算结果为 true 时, 就执行循环体语句。执行一次循环体语句后, 就会重新计算条件表达式, 当表达式的值为 false 时

25、,循环结束。while 循环可能一次也不执行。while 语句 (先判断后执行) Friday, August 12, 2022 北京林业大学信息学院计算机系do语句的一般形式为: do 循环体语句 while (条件表达式);do 语句先执行循环体语句, 然后计算条件表达式是否为 true, 如果是, 则继续执行循环, 否则结束循环。与 while 语句不同的是,do 循环中的循环体语句至少执行一次, 而while语句当条件第一次不满足时循环体语句一次也不执行。do while 语句 (先执行后判断) Friday, August 12, 2022 北京林业大学信息学院计算机系for 语句用

26、于预先知道循环次数的情况, 其一般形式为: for ( 初始化语句; 表达式1; 表达式2 ) 循环体语句;其中初始化语句可以是一条声明或表达式,用于对循环控制变量进行初始化或赋值。表达式 1 用于控制循环结束, 当它的值为 true 时, 继续循环, 为false时终止循环。表达式 2 在每次循环执行后改变循环控制变量的值。for 语句 Friday, August 12, 2022 北京林业大学信息学院计算机系具体来说,for循环的执行过程为: 执行初始化语句; 计算表达式 1的值; 如果表达式 1的值为true: 先执行循环体语句; 再执行表达式2; 然后转向步骤; 如果表达式1的值为f

27、alse, 则结束循环。 Friday, August 12, 2022 北京林业大学信息学院计算机系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之间所有数的和 Friday, August 12, 2022 北京林业大学信息学院计算机系除了顺序执行和分支、循环外, 有时需要中断一段程序的执行, 跳转到其它地方继续执行, 这时需用到跳转语句。跳转语句包括break、continue和goto语句跳转语句 Friday, August 12,

28、 2022 北京林业大学信息学院计算机系break语句终止switch语句的执行switch(grade) case a:case A: aCnt+; break;终止循环,跳出当前循环体for (r=1; r100)break;/面积100终止循环 printf (”%f”,area);break语句和continue语句 Friday, August 12, 2022 北京林业大学信息学院计算机系continue语句作用:结束本次循环,接着进行下一次是否执行循环的判定与break的区别break:终止整个循环,跳出循环体continue:终止本次循环 Friday, August 12,

29、2022 北京林业大学信息学院计算机系2、类、对象、构造函数与析构函数类是C+的核心类定义的一般形式为: class 类名private: 数据成员或成员函数 protected: 数据成员或成员函数 public: 数据成员或成员函数;只能由该类的成员函数,以及声明为友元的函数访问/不允许该类的派生类访问/允许该类的派生类访问/其它类的对象或操作可以访问 Friday, August 12, 2022 北京林业大学信息学院计算机系#ifndef _complex_h#define _complex_h#include class comlex public: complex ( ) Re =

30、 Im = 0; /不带参数的构造函数 complex ( double r, double i ) Re = r; Im = i; /分别置实部、虚部的构造函数 double getReal ( ) return Re; /取复数实部 double getImag ( ) return Im; /取复数虚部 complex complex: operator + ( complex& ob );/重载函数:复数加法运算 friend ostream& operator ( ostream& os, complex& c ); /友元函数:重载private: double Re, Im;/复

31、数的实部与虚部;#endif 试用C+的类声明定义“复数”的抽象数据类型 Friday, August 12, 2022 北京林业大学信息学院计算机系建立类的对象(亦称为实例化)时采用的方式类似于定义C变量的方式complex c1 (6, 3),c2(4,8); complex c3;c1、c2和c3都是complex 类的对象。C+的对象 Friday, August 12, 2022 北京林业大学信息学院计算机系构造函数(constructor)的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。它属于名字相同的类。在对象创建时由系统自动调用。如果程序中未声明

32、,则系统自动产生出一个缺省形式的构造函数构造函数complex ( ) Re = Im = 0; /不带参数的构造函数complex ( double r, double i ) Re = r; Im = i; /分别置实部、虚部的构造函数 ,也可写成:complex ( double r, double i ) : Re(r),Im(i) Friday, August 12, 2022 北京林业大学信息学院计算机系对于 complex c1 (6, 3);有 Re =r = 6, Im =i = 3对于complex c1;有 Re = Im = 0 Friday, August 12, 2

33、022 北京林业大学信息学院计算机系当要放弃对象时, 需隐式地调用另一个函数,叫做析构(destructor)函数, 它属于名字相同的类, 但在名字前面加上了一个“”。如:complex( )为一个类可定义几个构造函数,但只能定义 一个析构函数。当要退出变量的作用域时, 或当通过 delete 命令释放一个动态分配的变量时, 就要调用析构函数。析构函数 Friday, August 12, 2022 北京林业大学信息学院计算机系在 struct 中,缺省的访问级别是 public在 class 中, 缺省的访问级别是 private结构(struct)与类的区别class Rectangle

34、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 GetWidt

35、h ( );private: int x1, y1, h, w; Friday, August 12, 2022 北京林业大学信息学院计算机系在 union 中,缺省的访问级别是 public所有的数据成员共享相同的存储地址,节省存储空间联合(union)与类的区别stuct int num; char name10; char sex; char job; union int class; char position10; category;person100;numnamesexjobclass position 1011Lifs1012011Wangmtprof Friday, Augu

36、st 12, 2022 北京林业大学信息学院计算机系在C+中执行输入/输出操作, 需用#include预处理指令包括一个头文件。用它可支持C+的流(stream)操作。“流”是个简单的字符序列。在C+中有两个预定义的类istream和ostream,它们定义了输入流和输出流。基本输入/输出方式:键盘屏幕输入/输出文件输入/输出3、 C+的输入/输出 Friday, August 12, 2022 北京林业大学信息学院计算机系在C+中用cin,cout和cerr来定义键盘输入类、屏幕输出类和错误信息输出类。操作符 用于写出类ostream的一个对象,对于一系列输出对象,可用 用于读入类istre

37、am的一个对象。键盘屏幕输入/输出 Friday, August 12, 2022 北京林业大学信息学院计算机系在下面程序中使用了流 cin ,相继从标准输入设备上输入两个整型变量a和b, 并将它们打印到标准输出设备上。在输出语句中最后输出的endl是C+的I/O操作符, 它的用途是输出一个换行符并清空流。#include void main ( ) int a, b; cin a b; cout “a :” a “b :” b endl; Friday, August 12, 2022 北京林业大学信息学院计算机系C+中的输入/输出可以是自由格式,程序员不需要使用格式化符号来指定输入/输出项

38、的类型和顺序。与其它C+操作符一样,输入/输出操作符能够被重载。 Friday, August 12, 2022 北京林业大学信息学院计算机系在程序开头必须用预处理指令#include包含头文件,它定义了类ifstream、ofstream和fstream。要创建一个输入流, 必须声明它为ifstream类的实例要创建一个输出流, 必须声明它为ofstream类实例文件输入/输出 Friday, August 12, 2022 北京林业大学信息学院计算机系#include #include #include void main ( ) ofstream outFile(my.txt“, ios

39、:out);/ outFile为输出流对象,建立输出文件my.txt if(!outFile) cerrcannot open my.datendl;exit(1); /如果文件未被打开, 则outFile=0; 如果文件被成功地打开, 则它将代替cout, 将输出引导到文件my.txt中 char name =Zhang; int num = 12; outFile name endl; /输出到my.txt outFile num endl; ifstream inFile(my.txt,ios:in); if(!inFile) cerrcannot open my.dat name nu

40、m;coutnameendlnum b) return a; else return b; Friday, August 12, 2022 北京林业大学信息学院计算机系return 的作用是返回一个与返回类型相同类型的值,并中止函数的执行。void :函数无返回值 Friday, August 12, 2022 北京林业大学信息学院计算机系函数调用时传送给形参表的实参必须与形参在类型、个数、顺序上保持一致参数传递有两种方式传值(缺省)引用类型。C+中的参数传递 Friday, August 12, 2022 北京林业大学信息学院计算机系void main()float a,b; cinab;

41、swap(a,b);coutaendlbendl;#include void swap(float m,float n)float temp; temp=m; m=n; n=temp;使用传值方式时,把实参的值传送给函数局部工作区相应的副本中,函数使用这个副本执行必要的功能。这样,函数修改的是副本的值,实参的值不变。 Friday, August 12, 2022 北京林业大学信息学院计算机系数组名作形参#includevoid sub(char);void main(void ) char a10=“hello”; sub(a); coutaendl;void sub(char b ) b

42、=“world”;数组名做形参,传递的是数组的首地址,对形参数组所做的任何改变都将反映到实参数组中 Friday, August 12, 2022 北京林业大学信息学院计算机系#include #define N 10int max(int a);void main ( ) int a10;int i,m;for(i=0;iai;m=max(a);coutthe 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个整数的最大数 Friday, Augus

43、t 12, 2022 北京林业大学信息学院计算机系练习:用数组作为函数的参数,将数组中n个整数按相反的顺序存放,要求输入和输出在主函数中完成#include #define N 10void 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; Friday, August 12, 2022 北京林业大学信息学院计算机系#includ

44、e void swap (int& i, int& j);main ( ) int a = 1, b =2; cout a and b: a b n; swap ( a, b ); /调用时实际参数不需要加& cout a and b: a b n;void swap ( int& i, int& j ) /对换 i 与 j 的内容 int t = j; j = i; i = t;/不需要加 *引用类型作形参 Friday, August 12, 2022 北京林业大学信息学院计算机系(1)传递引用给函数与传递指针的效果是一样的,形参变化实参也发生变化。(2)引用类型作形参,在内存中并没有产生

45、实参的副本,它直接对实参操作;而一般变量作参数,形参与实参就占用不同的存储单元,所以形参变量的值是实参变量的副本。因此,当参数传递的数据量较大时,用引用比用一般变量传递参数的时间和空间效率都好。(3)指针参数虽然也能达到与使用引用的效果,但在被调函数中需要重复使用“*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。引用类型作形参的几点说明 Friday, August 12, 2022 北京林业大学信息学院计算机系#includevoid display(const double& r);void main(void )

46、 double d(9.5); display(d);void display(const double& r) coutrendl; 常值引用作形参常引用做形参,在函数中不能更新r所引用的对象,对应的实参不会被破坏 Friday, August 12, 2022 北京林业大学信息学院计算机系若传送的值参是一个对象 (作为类的实例) 时, 在函数中就创建了该对象的一个副本,调用拷贝构造函数,在函数结束前要调用该副本的析构函数撤消这个副本。若采用引用方式传递对象,在函数中不创建该对象的副本,也不存在最后撤消副本的问题。但是,通过引用传递的是对象时,函数对对象的改变将影响调用的对象。对象作形参 F

47、riday, August 12, 2022 北京林业大学信息学院计算机系#include class Temperature private: float highTemp, lowTemp; /数据成员 public: Temperature(int hi, int lo) /构造函数 highTemp = hi; lowTemp = lo; void UpdateTemp(float temp); /普通成员函数 float GetHighTemp( ) const; /常成员函数;普通成员函数允许改变该对象的私有数据成员常成员函数不能改变该对象的私有成员类型说明符 函数名(参数表)co

48、nst;成员函数的返回值 Friday, August 12, 2022 北京林业大学信息学院计算机系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); /常对象,必须初始化不能更新

49、t1. UpdateTemp( 10); t2. UpdateTemp( 10) ;/错误,常对象只能调用其常成员函数 t2. GetHighTemp( ) ; /正确 Friday, August 12, 2022 北京林业大学信息学院计算机系当成员函数的返回值为引用方式时, 该成员函数的返回值应是一个已存在变量(或对象)的别名。当该成员函数被重新赋值时, 其对应变量(或对象)的值将改变。目的:在内存中不产生被返回值的副本为了将该函数用在赋值运算符的左边,改变其对应变量(或对象)的值 使用方法:在函数类型后加上 “&”返回引用类型的函数 Friday, August 12, 2022 北京林

50、业大学信息学院计算机系#include char& replace(int m);char s80 = “Hello There”;main ( ) replace(5) = x; cout s; /用x代替Hello后面的空格char& replace ( int m ) return sm; /返回一个字符的引用类型,该函数的返回值是sm的别名返回引用类型的函数 Friday, August 12, 2022 北京林业大学信息学院计算机系函数名重载函数名相同,形参或返回类型不同5、重载#include void whatitis(int i) coutthis is integeriend

51、l;void whatitis(char c) cout“this is string”cendl; main() int i=1; char c=abcdef; whatitis(i); whatitis(c); Friday, August 12, 2022 北京林业大学信息学院计算机系运算符重载运算符重载是一种特殊的函数重载 类型名 operator(形参表)其中,operator是关键字,是运算符#include class complex public: complex ( ) Re = Im = 0; /不带参数的构造函数private: double Re, Im;/复数的实部与

52、虚部;complex complex : operator + ( complex& ob ) /重载函数:复数加法运算complex result; result .Re= Re + ob.Re; result . Im = Im + ob.Im ;return result; void main( )complex c1 (6, 3),c2(4,8),c3; c3=c1+c2 /c3=c1.operator+(c2) Friday, August 12, 2022 北京林业大学信息学院计算机系6、动态存储分配new 类型名T(初值列表)功能:申请用于存放T类型对象的内存空间,并依初值列表赋

53、以初值结果值:成功:T类型的指针,指向新分配的内存失败:0(NULL)int *p1= new int;或 int *p1 = new int(10);delete 指针P功能:释放指针P所指向的内存。P必须是new操作的返回值delete p1; Friday, August 12, 2022 北京林业大学信息学院计算机系用new创建数组:new 类型名T下标表达式;int *p2= new int10;/p2指向数组的首地址delete p2;delete p2;/只释放p2所指的第一个元素 Friday, August 12, 2022 北京林业大学信息学院计算机系友元函数不是该类的成员

54、函数,它可以是一个常规函数,也可以是另一个类的成员函数友元函数可以存取类的私有成员和保护成员7、友元(friend)函数和内联(inline)函数 Friday, August 12, 2022 北京林业大学信息学院计算机系友元函数的定义和使用方法 #include “iostream.h” class X1() private: int x; public: X1(int i) x=i; int getx(); friend void sum(X1 &a, X1 &b); /声明友元函数 ;int X1:getx() return x; Friday, August 12, 2022 北京林

55、业大学信息学院计算机系void sum(X1 &a,X1 &b)/定义函数cout用友元函数求各和:a.x+b.xendl; /可以访问类的私有成员void sum1(X1 &a,X1 &b) /定义普通函数cout 用普通函数调用类公共接口函数求和: a.getx( )+b.getx( )endl; void main() X1 m(1); X1 n(2); sum(m,n); sum1(m,n); Friday, August 12, 2022 北京林业大学信息学院计算机系friend ostream& operator ( ostream& os, complex & ob ) /友元函

56、数:重载,将复数ob输出到输出流对象os中 return os ob.Re = 0.0 ) ? “+” : “-”) fabs ( ob.Im ) “i”;class comlex public: complex ( ) Re = Im = 0; friend ostream& operator ( ostream& os, complex& c ); /友元函数:重载private: double Re, Im;/复数的实部与虚部; Friday, August 12, 2022 北京林业大学信息学院计算机系内联函数声明时使用关键字 inline编译时在调用处用函数体进行替换,节省了参数传递

57、、控制转移等开销#includeinline double CalArea(double radius)return 3.14*radius*radius;int main( )double r(3.0);double area;area=CalArea(r); /编译上行被替换CalArea函数体语句coutareaendl;return 0; Friday, August 12, 2022 北京林业大学信息学院计算机系模板就是使程序能够对不同类型的数据进行相同方式的处理C+中的模板分为函数模板和类模板8、模板 (template)函数模板的作用:函数模板可以用来创建一个通用功能的函数,使得

58、函数的某些参数、函数的返回值,能取任意类型,以支持多种不同形参,进一步简化重载函数的函数体设计声明方法:template 函数声明 Friday, August 12, 2022 北京林业大学信息学院计算机系#includetemplateT abs(T x) return x0?-x:x; void main( ) int n=-5; double d=-5.5; coutabs(n)endl; coutabs(d)endl;运行结果:55.5编译器从调用abs( )时实参的类型,推导出函数模板的类型参数。例如,对于调用表达式abs(n),由于实参n为int型,所以推导出模板中类型参数T为i

59、nt。当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数:int abs(int x) return x0?-x:x; 函数模板 Friday, August 12, 2022 北京林业大学信息学院计算机系类模板的作用类模板为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型类模板的声明方法:template 类声明类模板 Friday, August 12, 2022 北京林业大学信息学院计算机系模板参数表:class 标识符(指明可以接受一个类型参数)类型说明符 标识符(指明可以接受一个由“类型说明符”所规定类型的常量作为参数) 当参

60、数有多个时,需用逗号隔开。类模板的声明方法:template 类声明template class A1A1 x;template class A2A2 y;template class A3A3 z; Friday, August 12, 2022 北京林业大学信息学院计算机系template /定义类模板class Store private: T item; / 用于存放任意类型的数据 int haveValue; / 用于标记item是否已被存入内容 public: Store(void); / 缺省形式(无形参)的构造函数 T GetElem(void); /提取数据函数 void P

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论