C++面向对象程序设计第三章课件

上传人:文**** 文档编号:240744964 上传时间:2024-05-04 格式:PPT 页数:185 大小:1.59MB
返回 下载 相关 举报
C++面向对象程序设计第三章课件_第1页
第1页 / 共185页
C++面向对象程序设计第三章课件_第2页
第2页 / 共185页
C++面向对象程序设计第三章课件_第3页
第3页 / 共185页
点击查看更多>>
资源描述
大家好大家好1Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室第第3章:类和对象章:类和对象3.1 类和对象的基本概念类和对象的基本概念3.2 构造函数和析构函数构造函数和析构函数3.3 对象组和对象指针对象组和对象指针3.4 string类类3.5 向函数传递对象向函数传递对象3.6 对象的赋值和复制对象的赋值和复制3.7 静态成员静态成员3.8 友元友元3.9 类的组合类的组合3.10 常类型常类型Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.1)结构体和类结构体和类3.1.2)成员函数的定义成员函数的定义3.1.3)对象的定义和使用对象的定义和使用3.1.4)类的作用域和类成员的访问属性类的作用域和类成员的访问属性第第3章:类和对象章:类和对象Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.1 结构体和类结构体和类1)C+对对C语言的语言的结构体类型结构体类型进行了扩充:进行了扩充:struct complexdouble real;double imag;struct complexdouble real;double imag;void init(double r,double i)real=r;imag=i;C语言:语言:1)不同类型的)不同类型的数据数据;C+语言:语言:1)不同类型的)不同类型的数据数据 2)函数函数3.1.1 结构体和类结构体和类#include#include using namespace std;struct complex /声明结构体类型声明结构体类型 double real;/数据成员,复数实部数据成员,复数实部 double imag;/数据成员,复数虚部数据成员,复数虚部 void init(double r,double i)/成员函数,赋初值成员函数,赋初值 real=r;imag=i;double abscomplex()/成员函数,求复数绝对值成员函数,求复数绝对值 double t;t=real*real+imag*imag;return sqrt(t);int main()complex A;/定义结构体定义结构体complex的变量的变量A A.init(1.1,2.2);/调用成员函数调用成员函数init,给,给real和和imag赋初值赋初值 /调用成员函数调用成员函数abscomplex cout 复数的绝对值是:复数的绝对值是:A.abscomplex()endl;return 0;例例3.1:用扩充的结构体类型:用扩充的结构体类型求复数的绝对值求复数的绝对值复数的绝对值是:复数的绝对值是:2.45967程序的运行结果?程序的运行结果?Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.1 结构体和类结构体和类2)C+提供了一种比结构体提供了一种比结构体更安全有效的数据类型更安全有效的数据类型更安全有效的数据类型更安全有效的数据类型类类类类。类与结构体的扩充形式十分相似。类与结构体的扩充形式十分相似。/声明结构体类型声明结构体类型struct complex double real;double imag;void init(double r,double i)real=r;imag=i;double abscomplex()double t;t=real*real+imag*imag;return sqrt(t);/声明一个名为声明一个名为complex的类的类class complex double real;double imag;void init(double r,double i)real=r;imag=i;double abscomplex()double t;t=real*real+imag*imag;return sqrt(t);3.1.1 结构体和类结构体和类#include#include using namespace std;class complex double real;double imag;void init(double r,double i)real=r;imag=i;double abscomplex()double t;t=real*real+imag*imag;return sqrt(t);int main()complex A;A.init(1.1,2.2);cout 复数的绝对值是:复数的绝对值是:A.abscomplex()endl;return 0;例例3.2:用类类型替代例:用类类型替代例3.1中的结构体类型中的结构体类型程序的运行结果?程序的运行结果?error C2248:init:cannot access private member declared in class complexerror C2248:abscomplex:cannot access private member declared in class complexwhy?Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.1 结构体和类结构体和类3)为了保护类中数据的安全,)为了保护类中数据的安全,C+将类的成员分为两类:将类的成员分为两类:私有成员和公有成员。私有成员和公有成员。i)私有成员:用)私有成员:用private声明声明private修饰的变量和函数称为类的修饰的变量和函数称为类的私有成员私有成员,只能只能由本类的成员函数访问,类外的任何访问都由本类的成员函数访问,类外的任何访问都是非法的,是非法的,对外界是隐蔽的对外界是隐蔽的。实现信息隐藏实现信息隐藏在定义中,在定义中,private下面的每一行都是在其修饰下面的每一行都是在其修饰范围之内,范围之内,除非遇到除非遇到public或或protectedObject-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.1 结构体和类结构体和类ii)公有成员:用)公有成员:用public声明声明 使用使用public修饰的变量和函数称为类的修饰的变量和函数称为类的公有成公有成员员,对外是完全开放的对外是完全开放的,既可以被本类成员访问,既可以被本类成员访问,也可在类外被该类的对象访问。也可在类外被该类的对象访问。是类的是类的对外接口对外接口 在定义中,在定义中,public下面的每一行都是在其修饰下面的每一行都是在其修饰范围之内,除非遇到范围之内,除非遇到private或或protected。Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.1 结构体和类结构体和类4)公有成员与私有成员的默认情况:)公有成员与私有成员的默认情况:struct struct_namepublic:public data and functions;private:private data and functions struct_object_list;class class_nameprivate:private data and functions;public:public data and functions class_object_list;在struct中定义中定义私有成员和函数私有成员和函数,则必须使用必须使用关键字关键字private在class中定义中定义公有成员和函数公有成员和函数,则必须使用必须使用关键字关键字publica)默认情况下:结构体中的成员是公有的默认情况下:结构体中的成员是公有的b)默认情况下:类中的类员是私有的默认情况下:类中的类员是私有的Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.1 结构体和类结构体和类问题:请观察下面的两个定义是否等价?问题:请观察下面的两个定义是否等价?struct S_Locationvoid init(int initx,int inity);int GetX();int GetY();int x,y;class C_Locationvoid init(int initx,int inity);int GetX();int GetY();int x,y;main()S_Location loc1;C_Location loc2;loc1.init(2,5);loc2.init(2,5);loc1中的中的init函数函数是S_Locatioin结构中的公有成员,所以这个调用是正确的调用是正确的;loc2中的中的init函数函数是C_Location类中的私有成员,所以这个调用是错误的调用是错误的;例题例题3.3#include#include using namespace std;class complex /声明结构体类型声明结构体类型private:double real;/数据成员,复数实部数据成员,复数实部 double imag;/数据成员,复数虚部数据成员,复数虚部public:void init(double r,double i)/成员函数,赋初值成员函数,赋初值 real=r;imag=i;double abscomplex()/成员函数,求复数绝对值成员函数,求复数绝对值 double t;t=real*real+imag*imag;return sqrt(t);int main()complex A;/定义结构体定义结构体complex的变量的变量A A.init(1.1,2.2);/调用成员函数调用成员函数init,给,给real和和imag赋初值赋初值 /调用成员函数调用成员函数abscomplex cout 复数的绝对值是:复数的绝对值是:A.abscomplex()endl;return 0;类类型声明形式:类类型声明形式:Class 类名类名private:私有数据成员和成员函数;私有数据成员和成员函数;protected:保护数据成员和成员函数;保护数据成员和成员函数;public:公有数据成员和成员函数;公有数据成员和成员函数;Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.1 结构体和类结构体和类5)关于)关于protected的说明:的说明:1 1)定义:)定义:使用使用protected修饰的变量和函数称为类的修饰的变量和函数称为类的保护成员保护成员;2 2)规则:)规则:可以由本类的成员函数访问,可以由本类的成员函数访问,也可以由本类的派生类的也可以由本类的派生类的成员函数访问成员函数访问,但类外的任何访问都是非法的,但类外的任何访问都是非法的3 3)特性:)特性:它是它是半隐蔽的半隐蔽的Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.1)结构体和类结构体和类3.1.2)成员函数的定义成员函数的定义3.1.3)对象的定义和使用对象的定义和使用3.1.4)类的作用域和类成员的访问属性类的作用域和类成员的访问属性第第3章:类和对象章:类和对象3.1.2 成员函数的定义成员函数的定义 内联函数指内联函数指定义定义在类体内在类体内的成员函数,的成员函数,即该函数的函数体放即该函数的函数体放在类体内在类体内;1)成员函数可以分为)成员函数可以分为:i i)内联函数:)内联函数:class complex double real;double imag;void init(double r,double i)real=r;imag=i;double abscomplex()double t;t=real*real+imag*imag;return sqrt(t);Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.2 成员函数的定义成员函数的定义 外联函数指外联函数指说明在类体内说明在类体内,定义在类体定义在类体外外的成员函数。的成员函数。iiii)外联函数:)外联函数:返回类型返回类型 类名类名:函数名(参数表)函数名(参数表)/函数体函数体1)在所定义的成员函数名之前一定要缀上类名在所定义的成员函数名之前一定要缀上类名2)在类名和函数名之间应加上分隔符在类名和函数名之间应加上分隔符“:”Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室class Point public:void setpoint(int,int);/设置坐标点的成员函数设置坐标点的成员函数setpoint的函数原型的函数原型 int getx();/取取x坐标点的成员函数坐标点的成员函数getx的函数原型的函数原型 int gety();/取取y坐标点的成员函数坐标点的成员函数gety的函数原型的函数原型 private:int x,y;void Point:setpoint(int a,int b)/在类外定义成员函数在类外定义成员函数setpoint x=a;y=b;int Point:getx()/在类外定义成员函数在类外定义成员函数getx return x;Int Point:gety()/在类外定义成员函数在类外定义成员函数gety return y;例例Page54:表示坐标点的类表示坐标点的类Point可声明如下:可声明如下:3.1.2 成员函数的定义成员函数的定义Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.2 成员函数的定义成员函数的定义i)在类外定义成员函数时,必须在成员函数在类外定义成员函数时,必须在成员函数名之前缀上类名,在类名和函数名之间加上名之前缀上类名,在类名和函数名之间加上作用域运算符作用域运算符“:”void Point:setpoint(int a,int b)ii)如果在函数名前没有类名,或既无类名又如果在函数名前没有类名,或既无类名又无作用域运算符无作用域运算符“:”,则表明,则表明该函数该函数不属不属于任何类,于任何类,只是普通的函数只是普通的函数。:getx()或或getx()2)说明)说明:Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.2 成员函数的定义成员函数的定义iii)在类声明中只给出成员函数的原型,在类声明中只给出成员函数的原型,而将成员函数的定义放在类的外部而将成员函数的定义放在类的外部 是是C+C+程序设计的良好习惯程序设计的良好习惯。Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.2 成员函数的定义成员函数的定义隐式定义隐式定义:直接将函数定义在类内部:直接将函数定义在类内部显式定义显式定义:函数体在类定义体外,但是在:函数体在类定义体外,但是在类内函数原类内函数原型声明或类外定义前面型声明或类外定义前面冠以关键字冠以关键字“inline”。class A int X,Y;public:int a()return X;/隐式定义函数隐式定义函数a()为内联函数为内联函数 int b()return Y;/同上同上 int c();inline int A:c()return a()+b();/显式定义显式定义()为内联函数为内联函数3)内联函数的分类)内联函数的分类:Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.2 成员函数的定义成员函数的定义内联函数内联函数:1)原理:)原理:内联成员函数的函数体代码在编译时会被插入到每一内联成员函数的函数体代码在编译时会被插入到每一个调用它的地方。个调用它的地方。2)优点:)优点:减少调用开销,提高执行效率,但增加编译后代码长减少调用开销,提高执行效率,但增加编译后代码长度。度。3)扩展)扩展隐式定义:隐式定义:为了书写清晰,在类内函数原型声明前或类外定义成为了书写清晰,在类内函数原型声明前或类外定义成员函数前冠以关键字员函数前冠以关键字inline,以此显示地说明这是一个,以此显示地说明这是一个内联函数。内联函数。class Point public:/声明成员函数声明成员函数setpoint为内联函数为内联函数 inline void setpoint(int,int);inline int getx();/声明成员函数声明成员函数getx为内联函数为内联函数 inline int gety();/声明成员函数声明成员函数gety为内联函数为内联函数 private:int x,y;void Point:setpoint(int a,int b)/在类外定义此为内联函数在类外定义此为内联函数 x=a;y=b;int Point:getx()/在类外定义此函数为内联函数在类外定义此函数为内联函数 return x;Int Point:gety()/在类外定义此函数为内联函数在类外定义此函数为内联函数 return y;例例Page55:使用显示定义内联成员函数。使用显示定义内联成员函数。3.1.2 成员函数的定义成员函数的定义强调:强调:使用使用inline定定义内联函数时,义内联函数时,必须将类的声必须将类的声明和内联成员明和内联成员函数的定义都函数的定义都放在同一个文放在同一个文件件。Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.1)结构体和类结构体和类3.1.2)成员函数的定义成员函数的定义3.1.3)对象的定义和使用对象的定义和使用3.1.4)类的作用域和类成员的访问属性类的作用域和类成员的访问属性第第3章:类和对象章:类和对象Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.3 对象的定义和使用对象的定义和使用1、类与对象的关系、类与对象的关系类与对象是类与对象是型型和和值值的关系,的关系,C把把类的变量类的变量称为称为类的对象类的对象,对象也被称之为该,对象也被称之为该类的实例类的实例。一个类也就是用户声明的一个一个类也就是用户声明的一个数据类型数据类型。而。而类的对象则是该类类型的一个类的对象则是该类类型的一个实例实例。Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.3 对象的定义和使用对象的定义和使用2、对象的定义(两种方法)、对象的定义(两种方法)1)在声明类的同时,直接定义对象)在声明类的同时,直接定义对象2)声明了类之后,在使用时再定义对象。定义的格)声明了类之后,在使用时再定义对象。定义的格式与一般变量的定义格式相同,一般形式如下:式与一般变量的定义格式相同,一般形式如下:例如:例如:Class Point/op1,op2;Point op1,op2;类名类名 对象名对象名1,对象名,对象名2,.;Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.3 对象的定义和使用对象的定义和使用3、对象中成员的访问、对象中成员的访问1)通过对象名和对象选择符访问对象中的成员。)通过对象名和对象选择符访问对象中的成员。格式:格式:对象名对象名.数据成员名数据成员名对象名对象名.成员函数名(实参参数表)成员函数名(实参参数表)#include using namespace std;class Point public:void setpoint(int a,int b)x=a;y=b;int getx()return x;int gety()return y;private:int x,y;例例3.4:通过对象名和对象选择符访问对象中的成员:通过对象名和对象选择符访问对象中的成员3.1.3 对象的定义和使用对象的定义和使用int main()Point op1,op2;/定义对象定义对象op1,op2;int i,j;op1.setpoint(1,2);op2.setpoint(3,4);i=op1.getx();j=op1.gety();cout “op1 i=“i “j=“j endl;i=op2.getx();j=op2.gety();cout “op2 i=“i “j=“j endl;return 0;运行结果:运行结果:op1 i=1 j=2op2 i=3 j=4Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室注意:注意:对象不能在程序中引用私有成员。对象不能在程序中引用私有成员。例:如将例例:如将例3.4的主函数修改成如下格式,则发生错误:的主函数修改成如下格式,则发生错误:3.1.3 对象的定义和使用对象的定义和使用int main()Point op;int i,j;op.setpoint(1,2);i=op.x;/Error!不能直接访问对象的私有成员不能直接访问对象的私有成员x j=op.y;/Error!不能直接访问对象的私有成员不能直接访问对象的私有成员y cout “op x=“i “y=“j endl;return 0;i=op.getx();j=op.gety();Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.3 对象的定义和使用对象的定义和使用2)通过指向对象的指针访问对象中的成员)通过指向对象的指针访问对象中的成员class Date public:int year;Date d,*ptr;/定义对象定义对象d和指向类和指向类Date的指针变量的指针变量ptr=&d;/是是ptr指向对象指向对象dcoutyear;/输出输出ptr指向对象中的成员指向对象中的成员yeard.Year(*ptr).yearptr-year三者等价三者等价Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.3 对象的定义和使用对象的定义和使用3)通过对象的引用访问对象中的成员)通过对象的引用访问对象中的成员class Date public:int year;Date d1;/定义类定义类Date的对象的对象d1Date&d2=d1;/定义类定义类Date的引用的引用d2,并用,并用d1来初始化来初始化coutd1.year;/输出对象输出对象d1的数据成员的数据成员yearcoutd2.year;/输出对象输出对象d2的数据成员的数据成员yearObject-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.1)结构体和类结构体和类3.1.2)成员函数的定义成员函数的定义3.1.3)对象的定义和使用对象的定义和使用3.1.4)类的作用域和类成员的访问属性类的作用域和类成员的访问属性第第3章:类和对象章:类和对象Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.4 类的作用域和类成员的访问属性类的作用域和类成员的访问属性1)类的作用域:)类的作用域:规则:规则:作用域内:作用域内:一个类的成员函数可以不受限制地引用该一个类的成员函数可以不受限制地引用该类的数据成员类的数据成员 作用域外:作用域外:引用类的数据成员和成员函数时要受到一引用类的数据成员和成员函数时要受到一定的限制,有时甚至是不允许的定的限制,有时甚至是不允许的(比如私有成员比如私有成员)。定义定义:是指在类的声明中的一对花括号所形成的:是指在类的声明中的一对花括号所形成的作用域。作用域。Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.4 类的作用域和类成员的访问属性类的作用域和类成员的访问属性2)类成员的访问属性:)类成员的访问属性:class Sample private:int i;public:int j;set(int i1,int j1)i=i1;j=j1;int main()Sample a;/定义类定义类Sample的对象的对象a a.set(3,5);/在类外,类在类外,类Sample的对象的对象a可以访问公有成员函数可以访问公有成员函数set cout a.i endl;/ERROR!类类Sample的对象的对象a不能访问类的私有成员不能访问类的私有成员i cout a.j endl;/合法!合法!类类Sample的对象的对象a能够访问类的公有成员能够访问类的公有成员j return 0;Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.1.4 类的作用域和类成员的访问属性类的作用域和类成员的访问属性class abc public:int i;void set(int);void disp()cout“i=“iendl;void abc:set(int si)i=si;int fun()return i;void main()abc ob;ob.set(2);ob.disp();i=1;ob.disp();因为disp()是类abc的成员函数,所以在其中可以引用类abc的数据成员i因为set()是类abc的成员函数,所以在其中可以引用类abc的数据成员i因为fun()不是类abc的成员函数,且在该函数内部没有定义变量i,所以对i的引用为非法的因为main()不属于类abc的作用域,所以在该函数对i的引用为非法的Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室第第3章:类和对象章:类和对象3.1 类和对象的基本概念类和对象的基本概念3.2 构造函数和析构函数构造函数和析构函数3.3 对象组和对象指针对象组和对象指针3.4 string类类3.5 向函数传递对象向函数传递对象3.6 对象的赋值和复制对象的赋值和复制3.7 静态成员静态成员3.8 友元友元3.9 类的组合类的组合3.10 常类型常类型Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.1)对象的初始化和构造函数对象的初始化和构造函数3.2.2)用成员初始化列表对数据成员初始化用成员初始化列表对数据成员初始化3.2.3)构造函数的重载构造函数的重载3.2.4)带默认参数的构造函数带默认参数的构造函数3.2.5)析构函数析构函数第第3章:类和对象章:类和对象Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.1 对象的初始化和构造函数对象的初始化和构造函数一、对象的初始化一、对象的初始化1)使用初始化列表)使用初始化列表class student public:int number;char*name;float score3;/;student stu1=94055010,”zhang quan”,90.1,80,86;缺点:缺点:只能对只能对公有数据公有数据进行赋值进行赋值Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.1 对象的初始化和构造函数对象的初始化和构造函数2)使用自定义的成员函数)使用自定义的成员函数class date int d,m,y;public:void init(int dd,int mm,int yy);void add_year(int n);/;void date:init(int dd,int mm,int yy)d=dd;m=mm;y=yy;date today;today.init(20,5,2001);缺点:缺点:不能自动执行,必须要人为调用,主观因素太大。不能自动执行,必须要人为调用,主观因素太大。Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.1 对象的初始化和构造函数对象的初始化和构造函数是否只有上面介绍的两种对象初始化的办法?是否只有上面介绍的两种对象初始化的办法?NO!能够解决上面两个方案缺点的方法是:能够解决上面两个方案缺点的方法是:构造函数构造函数是一种是一种特殊的成员函数;特殊的成员函数;主要用于主要用于为对象分配空间;为对象分配空间;并按照程序员自己的意图并按照程序员自己的意图为对象初始化。为对象初始化。Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.1 对象的初始化和构造函数对象的初始化和构造函数二、构造函数二、构造函数1)构造函数的名字必须与类名相同,且不能有返回)构造函数的名字必须与类名相同,且不能有返回参数参数这一点是构造函数的特殊之处这一点是构造函数的特殊之处class ComplexPrivate:double real;double imag;Public:Complex(double r,double i)real=r;imag=i;构造函数Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.1 对象的初始化和构造函数对象的初始化和构造函数2)定义对象时,编译系统会自动调用构造函数)定义对象时,编译系统会自动调用构造函数降低了使用一般成员函数进行降低了使用一般成员函数进行对象初始化的主观因素对象初始化的主观因素#include#include using namespace std;class Complexpublic:Complex(double r,double i)real=r;imag=i;double abscomplex()double t;t=real*real+imag*imag;return sqrt(t);private:double real;double imag;int main()Complex A(1.1,2.2);cout“复数的绝对值复数的绝对值:”A.abscomplex()endl;return 0;运行结果:运行结果:复数的绝对值:复数的绝对值:2.4596753.2.1 对象的初始化和构造函数对象的初始化和构造函数3)建立对象的两种方式)建立对象的两种方式:(1)类名类名 对象名对象名(实参表实参表)(2)类名类名*指针变量名指针变量名=new 类名类名(实参表实参表)int main()Complex A(1.1,2.2);cout“复数的绝对值复数的绝对值:”A.abscomplex()endl;return 0;int main()Complex*pa=new Complex(1.1,2.2);cout“复数的绝对值复数的绝对值:”abscomplex()endl;delete pa;return 0;Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.1 对象的初始化和构造函数对象的初始化和构造函数4)与普通的成员函数一样,构造函数可以写在体内,)与普通的成员函数一样,构造函数可以写在体内,也可写在体外。也可写在体外。class Complexprivate:double real;double imag;public:Complex(double r,double i);/声明构造函数原型声明构造函数原型 double abscomplex();/声明成员函数原型声明成员函数原型;Complex:Complex(double r,double r)/在类外定义构造函数在类外定义构造函数 real=r;imag=i;Double Complex:abscomplex()/在类外定义成员函数在类外定义成员函数 double t;t=real*real+imag*imag;return sqrt(t);Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.1 对象的初始化和构造函数对象的初始化和构造函数5)构造函数的主要作用是用来对对象进行初始化。)构造函数的主要作用是用来对对象进行初始化。6)构造函数一般声明为公有成员,但它不能像其它)构造函数一般声明为公有成员,但它不能像其它成员那样被显式调用。成员那样被显式调用。它在定义对象的同时被自动调用,而且只执行它在定义对象的同时被自动调用,而且只执行一次。一次。A.Complex(double 1.1,double 2.2);3.2.1 对象的初始化和构造函数对象的初始化和构造函数7)在实际应用中,通常需要给每个类定义构造函数。)在实际应用中,通常需要给每个类定义构造函数。如果没有给类定义构造函数,则编译系统自动生如果没有给类定义构造函数,则编译系统自动生成一个默认构造函数。成一个默认构造函数。Complex:Complex()Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.1 对象的初始化和构造函数对象的初始化和构造函数8)构造函数可以不带参数。)构造函数可以不带参数。例题例题3.6Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室#include#include using namespace std;class Complexprivate:double real;double imag;public:Complex()real=0;imag=0;void init(double r,double i)real=r;imag=i double abscomplex()double t;t=real*real+imag*imag;return sqrt(t);int main()Complex A;/调用公有成员函数调用公有成员函数init给给real和和imag赋值赋值.A.init(1.1,2.2);cout“复数的绝对值复数的绝对值:”A.abscomplex()endl;return 0;Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.1)对象的初始化和构造函数对象的初始化和构造函数3.2.2)用成员初始化列表对数据成员初始化用成员初始化列表对数据成员初始化3.2.3)构造函数的重载构造函数的重载3.2.4)带默认参数的构造函数带默认参数的构造函数3.2.5)析构函数析构函数第第3章:类和对象章:类和对象Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.2 用成员初始化列表对数据成员初始化用成员初始化列表对数据成员初始化1)对数据成员的初始化工作一般在构造函数中采用)对数据成员的初始化工作一般在构造函数中采用赋值语句进行。赋值语句进行。class Complexprivate:double real;double imag;public:Complex(double r,double i);/声明构造函数原型声明构造函数原型 ;/在构造函数中用赋值语句对数据类型赋初值在构造函数中用赋值语句对数据类型赋初值complex:Complex(double r,double i)real=r;imag=i;Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.2 用成员初始化列表对数据成员初始化用成员初始化列表对数据成员初始化2)也可以采用构造初始化列表对数据成员进行初)也可以采用构造初始化列表对数据成员进行初始化始化.class Complexprivate:double real;double imag;public:Complex(double r,double i);/声明构造函数原型声明构造函数原型 ;/使用成员初始化列表对数据成员初始化使用成员初始化列表对数据成员初始化complex:Complex(double r,double i):real(r),imag(i)Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.2 用成员初始化列表对数据成员初始化用成员初始化列表对数据成员初始化带有成员初始化列表的构造函数的一般形式为:带有成员初始化列表的构造函数的一般形式为:类名类名:构造函数名构造函数名(参数表参数表):(成员初始化列表成员初始化列表)/构造函数体构造函数体 成员初始化列表的一般形式为:成员初始化列表的一般形式为:数据成员数据成员1(初始值初始值1),数据成员数据成员2(初始值初始值2),Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.2 用成员初始化列表对数据成员初始化用成员初始化列表对数据成员初始化3)两种方式的差异)两种方式的差异:在在C+中,某些类型的成员是不允许在构造中,某些类型的成员是不允许在构造函数中用赋值语句直接赋值的。函数中用赋值语句直接赋值的。例如:对于用例如:对于用const修饰的数据成员,或是修饰的数据成员,或是引用类型的数据成员,是不允许用赋值语句直接引用类型的数据成员,是不允许用赋值语句直接赋值的。因此,只能用成员初始化列表对其进行赋值的。因此,只能用成员初始化列表对其进行初始化。初始化。【例例3.7】用成员初始化列表对用成员初始化列表对引用类型的数据成员引用类型的数据成员和和const修饰的数据成员修饰的数据成员初始化。初始化。#include using namespace std;class Apublic:A(int x1):x(x1),rx(x),pi(3.14)void print()cout “x=“x “rx=“rx “pi=“pi endl;private:int x;int℞const double pi;3.2.2 用成员初始化列表对数据成员初始化用成员初始化列表对数据成员初始化int main()A a(10);a.print();return 0;运行结果:运行结果:x=10 rx=10 pi=3.14【例例3.8】强调:强调:数据成员是按照它们在类中声明的顺序进数据成员是按照它们在类中声明的顺序进行初始化的行初始化的,与它们在成员初始化列表中列出的顺序无关。,与它们在成员初始化列表中列出的顺序无关。#include using namespace std;class Dpublic:D(int i):mem2(i),mem1(mem2+1)cout“mem1:”mem1endl;cout“mem2:”mem2endl;private:int mem1;int mem2;3.2.2 用成员初始化列表对数据成员初始化用成员初始化列表对数据成员初始化int main()D d(15);return 0;运行结果:运行结果:mem1:-858993459mem2:15分析:分析:mem1使用使用“mem2+1”先初始先初始化,得随机值化,得随机值Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.1)对象的初始化和构造函数对象的初始化和构造函数3.2.2)用成员初始化列表对数据成员初始化用成员初始化列表对数据成员初始化3.2.3)构造函数的重载构造函数的重载3.2.4)带默认参数的构造函数带默认参数的构造函数3.2.5)析构函数析构函数第第3章:类和对象章:类和对象Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.3 构造函数的重载构造函数的重载C+允许重载构造函数允许重载构造函数,以适应不同的场合。以适应不同的场合。这些构造函数通过所带参数的个数或类型的不同这些构造函数通过所带参数的个数或类型的不同来区分。来区分。class A/public:A();A(int);A(int,char);A(float,char);/;main()A x;A y(10);A z(10,z);A w(4.4,w);3.2.3 构造函数的重载构造函数的重载【例例3.9】构造函数重载的应用:构造函数重载的应用:#include using namespace std;class Datepublic:Date();Date(int y,int m,int d);void showDate();private:int year;int month;int day;Date:Date()year=2000;month=4;day=28;Date:Date(int y,int m,int d)year=y;month=m;day=28;inline void Date:showDate()coutyear“.”month“.”dayendl;void main()Date date1;cout“Date1 output:”endl;date1.showDate();Date date2(2000,11,14);cout“Date2 output:”endl;date2.showDate();运行结果:运行结果:Date1 output:2000.4.28Date2 output:2000.11.28i)使用无参构造函创建对象时:使用无参构造函创建对象时:Date date1;不能使用:不能使用:Date date1();ii)如果在类中用户没有定义构造函数,系统会自动提如果在类中用户没有定义构造函数,系统会自动提供一个函数体为空的默认构造函数。供一个函数体为空的默认构造函数。iii)但是,但是,只要类中定义了一个构造函数只要类中定义了一个构造函数(不一定是(不一定是无参构造函数),无参构造函数),系统将不再提供默认构造函数系统将不再提供默认构造函数。说明说明:Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.3 构造函数的重载构造函数的重载3.2.3 构造函数的重载构造函数的重载【例例3.10】分析程序的运行结果:分析程序的运行结果:#include using namespace std;class Location public:Location(int m,int n)X=m;Y=n;void Init(int initX,int initY)X=initX;Y=initY;int GetX()return X;int GetY()return Y;private:int X,Y;int main()Location A3;A3.Init(785,980);coutA3.GetX()“”A3.GetY()endl;ERROR!3.2.3 构造函数的重载构造函数的重载【例例3.11】关于计时器的例子:关于计时器的例子:#include using namespace std;class timer public:timer()seconds=0;timer(char*t)seconds=atoi(t);timer(int t)seconds=t;timer(int min,int sec)seconds=min*60+sec;int gettime()return seconds;private:int seconds;int main()timer a;timer b(10);timer c(“20”);timer d(1,10);cout“sec1=“a.gettime()endl;cout“sec2=“b.gettime()endl;cout“sec3=“c.gettime()endl;cout“sec4=“d.gettime()endl;return 0;sec1=0sec1=0sec2=10sec2=10sec3=20sec3=20sec4=70sec4=70Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.1)对象的初始化和构造函数对象的初始化和构造函数3.2.2)用成员初始化列表对数据成员初始化用成员初始化列表对数据成员初始化3.2.3)构造函数的重载构造函数的重载3.2.4)带默认参数的构造函数带默认参数的构造函数3.2.5)析构函数析构函数第第3章:类和对象章:类和对象Object-Oriented Programming 计算机系基础理论教研室计算机系基础理论教研室3.2.4 带默认参数的构造函数带默认参数的构造函数 对带参数的构造函数,定义对象时必须给构造函数传递对带参数的构造函数,定义对象时必须给构造函数传递参数,否则,构造函数将不被执行。实际中有些构造函数的参数,否则,构造函数将不被执行。实际中有些构造函数的参数值通常不变,此时可将它定义成带缺省参数的构造函数参数值通常不变,此时可将它定义成带缺省参数的构造函数date:date(int dd=1,int mm=1,int yy=2000):d(dd),m(mm),y(yy)date today;date today(20);date today(20,5);date today(20,5,2001);全部使用缺省参数,没有参数传递相当于date(20,1,2000)相当于date(20,5,2000)相当于date(20,5,2001)【例例3.12】带默认参数的构造函数:带默认参数的构造函数:#include#include using namespace std;class Complex public:Complex(double r=0.0,double i=0.0)double abscomplex();private:double real;double imag;Complex:Complex(double r,double i)real=r;imag=i;double Complex:abscomplex()double t;t=real*real+imag*imag;return sqrt(t);3.2.4 带默认参数的构造函数带默认参数的构造函数int main()Complex S1;coutS1.abscomplex()endl;Complex S2(1.1);coutS1.abscomplex()endl;Complex S3(1.1,2.2);coutS1.abscomplex()endl;return 0;i)如果构造函数在类的声明外定义,那么默认参数应如果构造函数在类的声明外定义,那么默认参数应该在类内声明构造函数原型时指定,而不是在类外该在类内声明构造函数原型时指定,而不是在类外构造函数定义时指定。构造函数定义时指定。ii)如果如果构造函数的全部参数都指定了默认值构造函数的全部参数都指定了默认值,该构造,该构造函数也函数也属于默认构造函数属于默认构造函数。complex(doubl
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!