C++语言程序设计:第九章 函数模板和类模板_第1页
C++语言程序设计:第九章 函数模板和类模板_第2页
C++语言程序设计:第九章 函数模板和类模板_第3页
C++语言程序设计:第九章 函数模板和类模板_第4页
C++语言程序设计:第九章 函数模板和类模板_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

1、C+语言程序设计浙江工业大学第九章第九章 函数模板和类模板函数模板和类模板C+C+语言程序设计语言程序设计C+语言程序设计浙江工业大学2上机时间和考试时间上机时间和考试时间 上机上机 4月月24日,星期三,日,星期三,6号机房上机,上机内容为:号机房上机,上机内容为:8-2, 8-6, 8-9。 考试考试 时间:时间:4月月21日,星期天晚上日,星期天晚上6:30 地点:广地点:广B109 事件:期中考试事件:期中考试C+语言程序设计浙江工业大学上一章内容回顾上一章内容回顾3多态性的概念多态性的概念运算符重载运算符重载虚函数虚函数纯虚函数和纯虚函数和抽象类抽象类C+语言程序设计浙江工业大学4纯

2、虚函数和抽象类纯虚函数和抽象类纯虚函数与抽象类抽象类抽象类是指至少有一个纯虚函数的类。是指至少有一个纯虚函数的类。抽象类只能用作其他类的基类,不能建立抽象类对象抽象类只能用作其他类的基类,不能建立抽象类对象在以抽象类作为基类的派生类中必须实现所有纯虚函在以抽象类作为基类的派生类中必须实现所有纯虚函数;否则,这样的派生类也是不能产生对象的数;否则,这样的派生类也是不能产生对象的可以定义抽象类类型的指针和引用,此指针和引用可可以定义抽象类类型的指针和引用,此指针和引用可以指向它们的派生类,进而实现多态性以指向它们的派生类,进而实现多态性抽象类的特点抽象类的特点C+语言程序设计浙江工业大学5本章主要

3、内容本章主要内容 模板概述模板概述 函数模板函数模板 类模板类模板 练习和程序实例练习和程序实例C+语言程序设计浙江工业大学1.1.模板概述模板概述6C+语言程序设计浙江工业大学7代码结构类似的函数代码结构类似的函数int add(int a, int b) return a + b;double add(double a, double b) return a + b;T add(T a, T b) return a + b; 函数名字相同、参数个数相同函数名字相同、参数个数相同 参数类型和返回值类型不同参数类型和返回值类型不同 将参数类型用将参数类型用T 表示,得到如图形式的通用函数表示,

4、得到如图形式的通用函数 调用函数时用调用函数时用int 或或double代入代入T 即可,即将数据类即可,即将数据类型作为参数传递型作为参数传递特点:特点:模板概述C+语言程序设计浙江工业大学8代码结构相似的类代码结构相似的类模板概述class A int i;public: A(int a) i=a; void set (int b) i=b; ;class B double i;public: B(double a) i=a; void set (double b) i=b; ; 结构相同结构相同 仅类型不同,则可以合仅类型不同,则可以合并为如右图形式并为如右图形式 在建立对象时用在建立对

5、象时用int或或double代入代入T即可。即将即可。即将数据类型作为参数传递数据类型作为参数传递特点:特点:class C T i;public: B(T a) i=a; void set (T b) i=b; ;C+语言程序设计浙江工业大学9模板概念模板概念 模板是模板是C+ 支持支持参数化多态参数化多态的工具,使的工具,使用模板可以使用户为函数或者类声明一用模板可以使用户为函数或者类声明一种一般模式,使得类中的某些数据成员种一般模式,使得类中的某些数据成员或者成员函数(以及非成员函数)的参或者成员函数(以及非成员函数)的参数、返回值取得任意类型。数、返回值取得任意类型。模板概述C+语言程

6、序设计浙江工业大学10模板概念模板概念 模板是一种对类型进行参数化的工具模板是一种对类型进行参数化的工具 通常有两种形式:函数模板和类模板通常有两种形式:函数模板和类模板 函数模板针对仅参数类型不同的函数函数模板针对仅参数类型不同的函数 类模板针对仅数据成员和成员函数类型类模板针对仅数据成员和成员函数类型不同的类不同的类 模板不是函数或者类,它们是一组编译模板不是函数或者类,它们是一组编译器能够理解的规则,利用该规则编译器器能够理解的规则,利用该规则编译器能够生成(实例化)函数或者类能够生成(实例化)函数或者类模板概述C+语言程序设计浙江工业大学2.2.函数模板函数模板11C+语言程序设计浙江

7、工业大学12函数模板的定义方式函数模板的定义方式函数模板template 类型类型 函数名函数名(参数表参数表)函数体函数体语法形式:语法形式:或者:或者:template 类型类型 函数名函数名(参数表参数表)函数体函数体1. 所有函数模板的定义都是用所有函数模板的定义都是用templatetemplate关键字关键字开始,开始,该关键字之后使用尖括号该关键字之后使用尖括号括起来的是模板参数表括起来的是模板参数表2. 模板参数表由用模板参数表由用逗号分隔逗号分隔的模板参数构成的模板参数构成3. . classclass或或typenametypename 是一个标识符,其后可以跟一是一个标识

8、符,其后可以跟一个类型参数个类型参数C+语言程序设计浙江工业大学13函数模板的使用函数模板的使用函数模板template T Max(T a, T b) /T为模板参数为模板参数 return a b ? b : a; 例例1:编写求两个相同类型数中最大数的函数:编写求两个相同类型数中最大数的函数模板模板#include void main() cout Max(5,8) endl; cout Max(5.5,6.7) endl; cout Max(A, B) endl; 输出:输出:86.7B编译器是如何编译这段代码的?编译器是如何编译这段代码的?/根据函数模板以及使用情况,编译器实例化了三

9、份实例根据函数模板以及使用情况,编译器实例化了三份实例int Max(int a, int b) return a b ? b : a; double Max(double a, double b) return a b ? b : a; char Max(char a, char b) return a b ? b : a; void main cout Max(5,8) endl; C+语言程序设计浙江工业大学14函数模板类型参数的使用函数模板类型参数的使用函数模板1)一个函数模板可以有多个类型参数)一个函数模板可以有多个类型参数template void print(T1 arg1, T

10、2 arg2) cout arg1: arg1 endl; cout arg2: arg2 endl; C+语言程序设计浙江工业大学15函数模板类型参数的使用函数模板类型参数的使用函数模板2)函数模板的类型参数可以用于函数模板的)函数模板的类型参数可以用于函数模板的局部变量定义局部变量定义template void print(T1 arg1, T2 arg2) T1 localArg1 = arg1; cout arg1: localArg1 endl; cout arg2: arg2 endl; C+语言程序设计浙江工业大学16合理确定类型参数的个数合理确定类型参数的个数函数模板赋值兼容原

11、则引起函数模板中类型参数的二义赋值兼容原则引起函数模板中类型参数的二义性性template void print(T arg1, T arg2) cout arg1: arg1 endl; cout arg2: arg2 endl; print(5, 7); print(5.8, 8.4); print(5, 8.4); /ok:用用int替换替换T/ok:用用double替换替换T/error:用用double或者或者int替换替换T?template void print(T1 arg1, T2 arg2) cout arg1: arg1 endl; cout arg2: arg2 end

12、l; print(5, 7); print(5.8, 8.4); print(5, 8.4); /ok:用用int替换替换T1,用用double替换替换T2C+语言程序设计浙江工业大学函数模板的重载函数模板的重载函数模板函数模板与函数模板的重载:同一函数名,参函数模板与函数模板的重载:同一函数名,参数的数量不同数的数量不同template void print(T arg) cout arg: arg endl; template void print(T1 arg1, T2 arg2) cout arg1: arg1 endl; cout arg2: arg2 endl; print(5);

13、 print(5.8, 8.4); / ok:根据第二个函数模板替换根据第二个函数模板替换 /ok:根据第一个函数模板替换根据第一个函数模板替换C+语言程序设计浙江工业大学3.3.类模板类模板18C+语言程序设计浙江工业大学19类模板的定义格式类模板的定义格式类模板语法形式:语法形式:template class 类名类名 类模板的使用:类模板的使用:1)使用模板类定义对象:类名)使用模板类定义对象:类名 对象名对象名2)在类体外定义的成员函数,应定义成函数模板。)在类体外定义的成员函数,应定义成函数模板。C+语言程序设计浙江工业大学20类模板的定义和使用类模板的定义和使用类模板/定义类模板定

14、义类模板template class Base T a; public: Base( T b) a = b; T getA() return a; ;/使用使用 void main() Base A(1); Base B(2.1); cout A.getA() endl; cout B.getA() endl; C+语言程序设计浙江工业大学21在类模板外定义成员函数在类模板外定义成员函数类模板语法形式:语法形式:template 类型名类型名 类名类名:函数名(参数表)函数名(参数表)/定义类模板定义类模板template class Base T a; public: Base( T b)

15、a = b; T getA() return a; /类内定义类内定义 void setA(T v); /类外定义类外定义 ;template void Base:setA(T v) a = v; C+语言程序设计浙江工业大学4.4.练习和程序实例练习和程序实例22C+语言程序设计浙江工业大学23已知函数已知函数int fn(int n) return n + n;和函数和函数long fn(long n)return n + n;是一个函数模板的两个实例,则该函数模板的定义是:是一个函数模板的两个实例,则该函数模板的定义是:template T fn(T n)return n + n;C+语

16、言程序设计浙江工业大学24#include using namespace std; template class A T a1, a2, a3; public: A(T b1, T b2, T b3) a1 = b1; a2 = b2; a3 = b3; T Sum() return a1 + a2 + a3; ; void main() A x(2,3,4),y(5,7,9); cout x.Sum() y.Sum() endl; 输出:?输出:?9 21C+语言程序设计浙江工业大学251.下面的模板声明中, 正确的是: ( )A) templateB) templateC) templa

17、teD) template答案:答案:C2. 有如下模板定义:template T fun(T x, T y) return x * x + y * y;在下列对fun的调用中,错误的是: ( )A) fun(2, 8) B) fun(2.0, 8.2) C) fun(2.3, 8) D) fun (2, 8)答案:答案:C3. 关于类模板的说法正确的是: ( )A) 类模板的主要作用是生成抽象类B) 类模板实例化时,编译器将根据给出的模板实参生成一个类C) 在类模板中的数据成员具有同样类型D) 类模板中的成员函数没有返回值答案:答案:BC+语言程序设计浙江工业大学26P1-6面向对象的基本概

18、念面向对象的基本概念P78-81函数的参数传递函数的参数传递:1)按值传递;)按值传递;2)按引用传递)按引用传递void swap(int a, int b) void swap(int& a, int& b)P81-82内联函数内联函数(inline):在调用时不发生控制转移,而:在调用时不发生控制转移,而是在编译时将函数体嵌入在每一个调用处是在编译时将函数体嵌入在每一个调用处inline void swap(int&a, int& b) class A void f() ;核心知识点复习基础基础知识点汇总知识点汇总C+语言程序设计浙江工业大学27P84-8

19、6函数重载函数重载:函数名相同,但是形参的个数或者类:函数名相同,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的型不同,编译器根据实参和形参的类型及个数的最佳匹配,确定用哪个函数最佳匹配,确定用哪个函数int add(int, int y); double add(double x, double y); 核心知识点复习P82-84带默认形参值的函数带默认形参值的函数:在函数定义时可以预先声:在函数定义时可以预先声明默认的形参值;有默认值的形参右面,不能出明默认的形参值;有默认值的形参右面,不能出现无默认值的形参现无默认值的形参int add(int x, int y = 5,

20、 int z = 6); /okint add(int x = 1, int y = 5, int z); /error基础基础知识点汇总知识点汇总C+语言程序设计浙江工业大学28核心知识点复习抽象抽象 封装封装 类类class关键字关键字关键概念和术语C+提供的语法支持有机整体有机整体设计思路数据成员数据成员成员函数成员函数数据类型的定义数据类型的定义函数的定义函数的定义共同属性和共同属性和行为行为类成员的类成员的访问控制访问控制public, private, protected三个关键字三个关键字不同的访问不同的访问权限权限构造函数构造函数与类名相同名称的成员函数,与类名相同名称的成员函

21、数,无返回值无返回值初始化对象初始化对象状态状态析构函数析构函数类名前加类名前加“”的成员函数,的成员函数,无返回值,没任何参数无返回值,没任何参数清理工作清理工作类和对象类和对象知识点汇总知识点汇总C+语言程序设计浙江工业大学29核心知识点复习关键概念和术语C+提供的语法支持设计思路对象对象 实例实例类名类名 对象名对象名;对象名对象名.数据成员名数据成员名对象名对象名.成员函数名成员函数名 (参数表参数表)如何使用类?如何使用类?类的组合类的组合内嵌对象的定义,组合类对内嵌对象的定义,组合类对象的初始化和退出前清理规象的初始化和退出前清理规则则类中含其它类中含其它类的对象类的对象前向前向引

22、用声明引用声明先声明再使用,不能涉及类先声明再使用,不能涉及类的任何实现细节的任何实现细节先使用类的先使用类的符号,其它符号,其它地方定义类地方定义类的具体实现的具体实现类和对象类和对象知识点汇总知识点汇总C+语言程序设计浙江工业大学30核心知识点复习类和对象类和对象知识点汇总知识点汇总class C ; class B;class A int m_i; public: A() A(int i):m_i(i) m_j = 0; A(A& a) m_i = a.m_i; m_j = a.m_j; A() void disp() cout m_i , m_j 0) int b; 3)类作用

23、域)类作用域:类:类X的成员的作用域;的成员的作用域;a)成员函数直接访问,成员函数直接访问,b) x.m或者或者X:m访问,访问,c)对象的指针访问(对象的指针访问(ptr-m)4)命名空间作用域)命名空间作用域:namespace 命名空间名命名空间名 各种声明各种声明可见性可见性:程序运行到某个位置,能够引用到(操作)的标:程序运行到某个位置,能够引用到(操作)的标识符;表示从内层作用域向外层作用域识符;表示从内层作用域向外层作用域“看看”时能看到什时能看到什么。么。块作用域块作用域类作用域类作用域命名空间作用域命名空间作用域对象的生存期对象的生存期:对象从产生到结束的这段时间就是它的:

24、对象从产生到结束的这段时间就是它的生存期。生存期。静态生存期静态生存期:与程序的运行期相同;在文件作用域中声:与程序的运行期相同;在文件作用域中声明的对象具有这种生存期;函数体内明的对象具有这种生存期;函数体内static修饰的对象修饰的对象动态生存期动态生存期:块作用域中声明的,没有用:块作用域中声明的,没有用static修饰的修饰的对象是动态生存期的对象对象是动态生存期的对象例:例:int i = 1; / i 为全局变量,具有静态生存期为全局变量,具有静态生存期void other() static int a = 2; / a 为静态局部变量,具有静态生存期为静态局部变量,具有静态生存

25、期 int c = 10; /b局部变量,具有动态生存期局部变量,具有动态生存期类的静态成员类的静态成员:包括静态数据成员和静态函数成员,他:包括静态数据成员和静态函数成员,他们都属于整个类,为类的所有对象共享。们都属于整个类,为类的所有对象共享。class A int a, b, c; static int d; static f() d+;/静态数据成员定义静态数据成员定义int A:d = 0;友元友元:友元关系提供了不同类或对象的成员函数之间、:友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制,包类的成员函数与一般函数之间进行数据共享的机制,包括友

26、元函数和友元类。括友元函数和友元类。友元函数友元函数:friend修饰的非成员函数;可以通过对象名修饰的非成员函数;可以通过对象名访问类的私有和保护成员;访问类的私有和保护成员;class Afriend void f() 友元类友元类:若一个类为另一个类的友元,则此类的所有成:若一个类为另一个类的友元,则此类的所有成员都能访问对方类的私有成员员都能访问对方类的私有成员class Bfriend class A;共享数据的保护共享数据的保护:通过声明为:通过声明为常量常量来保护共享的数据。来保护共享的数据。常对象常对象:const A a(3, 4); /a为常对象,不能被为常对象,不能被 更

27、新更新常成员函数常成员函数:不对类的数据成员进行修改:不对类的数据成员进行修改class 类名类名类型说明符类型说明符 函数名(形参表)函数名(形参表) const; 常数据成员常数据成员:class 类名类名const 类型说明符类型说明符 变量名变量名;常引用常引用:所引用的对象不能被更新:所引用的对象不能被更新void f(const Point& p); /确保确保f函数内不能对函数内不能对p进行修改进行修改C+语言程序设计浙江工业大学32核心知识点复习数组、指针和字符串数组、指针和字符串知识点汇总知识点汇总对象数组对象数组对象指针对象指针this指针指针new&del

28、ete浅拷贝浅拷贝深拷贝深拷贝字符串类字符串类声明声明: 类名类名 数组名数组名元素个数元素个数;使用使用: 数组名数组名下标下标.成员名成员名初始化初始化:Point a2 ; 或者或者 Point a2=Point(1,2),Point(3,4);删除删除: 调用析构函数调用析构函数声明声明: 类名类名 *对象指针名对象指针名;使用使用: 对象指针名对象指针名-成员名成员名例:例: Point a(5,10); Point * ptr = &a; ptr-getX();隐含于每一个类的成员函数中的特殊指针隐含于每一个类的成员函数中的特殊指针;this指针指针指向了成员函数当前所操作

29、的数据所指向了成员函数当前所操作的数据所属的对象属的对象;Point void getX() ; Point void getX(Point * this) Point a; a.getX() getX(&a)this指针不是类的数据成员指针不是类的数据成员new操作符操作符:表示从堆内存中申请一块空间:表示从堆内存中申请一块空间用法:用法:new 数据类型数据类型 new 数据类型(初始化值)数据类型(初始化值) new 数据类型数据类型常量表达式常量表达式delete操作符操作符:表示将从堆内存中申请的一块:表示将从堆内存中申请的一块 空间返还给堆空间返还给堆用法用法 delete

30、 指针名指针名 delete 指针名指针名例:例:int * p = new int10; for (int i = 0; i 10; i+, p+) *p = 1; delete p;浅拷贝浅拷贝: 实现对象间数据元素的一一对应复制实现对象间数据元素的一一对应复制深拷贝深拷贝:当被复制的对象数据成员是指针类型当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所时,不是复制该指针成员本身,而是将指针所指的对象进行复制指的对象进行复制例:例: 武士和宝藏武士和宝藏string实际上是对字符数组操作的封装实际上是对字符数组操作的封装例:例:string s1; /建立一个空字符

31、串建立一个空字符串string s2 = “abc”; /用常量建立一个初值用常量建立一个初值 为为”abc”的字符串的字符串string s3 = s2; /执行拷贝构造函数,用执行拷贝构造函数,用s2的值作为的值作为s3的初值的初值C+语言程序设计浙江工业大学33核心知识点复习1. 考虑函数原型void test(int a,int b=7,char *ch=*),下面的函数调用中,属于不合法调用的是:( )A)test(5) B)test(5,8) C)test(6,“#”) D)test(0,0,*);答案:答案:C2. 下列表示引用的方法中,( )是正确的。已知: k=1000; A

32、) int &x=k; B)char &y;C)int &z=1000; D)float &t=&k;答案:答案:A3. 下列析构函数的特征,()是正确的。 A)一个类只能定义一个析构函数 B)析构函数名与类名无关C)析构函数的定义只能在类体内D)析构函数可以有一个或者多个参数答案:答案:AC+语言程序设计浙江工业大学34核心知识点复习4在C+中,关于下列设置参数默认值的描述中,正确的是( )。A) 程序中有函数重载,就不能设置参数默认值B) 设置参数默认值,只能在函数定义时进行C) 设置参数默认值时,应该是先设置右边的再设置左边的D) 设置参数默认值时,应该全部参数都设置答案:答案:C5下列标识符中,具有文件作用域的是( )。A) 函数参数 B) 语句标号 C) 静态全局变量 D) 局部变量答案:答案:C6. 已知:print()函数是一个类的常成员函数,

温馨提示

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

评论

0/150

提交评论