您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业财务 > c++讲义(4)类与对象的定义
第4讲类与对象的定义1、类的定义(P101)2、对象的定义(P105)3、实例(栈)问题引入:C语言中的结构体#includeiostream.hstructdate{intyear,month,day;};voidmain(){structdated1;d1.year=1999;d1.month=12;d1.day=31;coutd1.year/d1.month/d1.dayendl;}分析:结构体变量d1有三个成员,主函数main可以直接使用d1的三个成员。即:结构体类型没有封装功能。而面向对象的程序设计的一个重要特征就是封装性,采用类可以实现数据的封装。1、什么是类?类是对具有相同数据和方法的一组对象的定义或描述。(类的描述中包含数据与对数据操作方法的定义)一个类的所有对象都有相同的数据结构,并且共享实现操作的代码。2、什么是对象?对象是类的一个实例,因此在定义了类之后,利用类来创建该类的对象。3、类和对象的关系类是一种新的数据类型,对象是这种类型的变量。一、基本概念二、类的声明(P102)1、类的声明格式class类名{private:私有数据成员和成员函数;protected:保护数据成员和成员函数;public:公有数据成员和成员函数;};各个成员函数的实现;考虑:如何定义一个表示日期的类#includeiostream.hclassTDate{private:intyear,month,day;public:voidSetDate(inty,intm,intd);voidPrint()//输出日期函数{coutyear/month/dayendl;}};voidTDate::SetDate(inty,intm,intd){year=y;month=m;day=d;}//设置日期函数说明:函数SetDate的实现放在外面,而函数Print的实现放在类的定义中间。2、在每个类的定义中:①class是定义类的关键字。②类名是一个标识符,用于标识一个类③大括号内是类的说明部分,说明该类的成员。从内容上来看:类的成员分数据成员和函数成员两种。从访问性来看:类的成员分为私有成员(private)、公有成员(public)和保护成员(protected)三种。④public、private和protected的出现次数与次序可以任意,如果没有指定,访问性隐含为private用关键字private定义的成员构成类的内部状态,public的成员则构成与外界通信的接口,通过public的成员函数来使用private的数据成员,从而在C++中实现了封装。3、注意(P104)①在类的定义中不允许对其数据成员初始化②将函数的实现类定义的大括号内,该成员函数隐含为内联(内嵌)函数;如果将内联函数的实现写在大括号外面,则应在函数名前加上inline三、对象的定义(P104)1、对象的定义格式:类名变量名表;或类名对象名;如:前面已定义了类TDate则:TDated1,d2;定义2个对象d1和d2对象是属于类的变量,每个对象占用各自的存储单元,每个对象各自具有了该类的一套数据成员(静态成员除外)2、访问对象成员的方法:访问对象的成员包括数据成员和成员函数,其访问格式是:对象名.成员名如前面的例中,对应的主函数如下:voidmain(){TDated1;//定义对象变量d1.SetDate(2004,10,8);//调用成员函数设置d1的日期为2004年10月8日d1.Print();//调用成员函数显示d1的日期}程序设计示例:复数类(参考P102)①复数类Complex的属性有:real:实部,代表复数的实数部分;image:虚部,代表复数的虚数部分。②复数类Complex的方法有:get_real():获得复数对象的实部。get_image():获得复数对象的虚部。set_real(doubled):将当前复数对象的实部设置为给定的形式参数的值。set_image(doubled):将当前复数对象的虚部设置为给定的形式参数的数值。disp(Complexc):用数学方式显示复数,例如实部为3,虚部为5,则显示:3+5i3、类成员的访问控制与作用域(P103)类的作用域就是在程序中,类的成员说明起作用的区域。它是由类说明时左右花括号中的内容和类的成员函数的作用域组成。类作用域介于函数作用域与文件作用域之间。私有成员与保护成员局限于类的作用域;公有成员的作用域可以是整个文件,但在类作用域之外要使用对象名或指向对象的指针名来修饰,即:①对象名.成员名②指向对象的指针名-成员名③(*指向对象的指针名).成员名参考下面的程序:#includeiostream.hclasstest{private:intx;public:inty;intgetx();};inttest::getx(){returnx;}intf(){returnx;}//错误voidmain(){testt;coutt.xendl;//错误coutt.yendl;}修改下面程序中的错误:#includeiostream.hclassTDate{private:intyear,month,day;public:voidSetDate(inty,intm,intd){year=y;month=m;day=d;}};voidmain(){TDated1;d1.SetDate(2004,10,8);coutd1.year/d1.month/d1.dayendl;//使用了类的私有成员year、month、day}将程序改为:#includeiostream.hclassTDate{private:intyear,month,day;public:intyy(){returnyear;}intmm(){returnmonth;}intdd(){returnday;}voidSetDate(inty,intm,intd){year=y;month=m;day=d;}};voidmain(){TDated1;d1.SetDate(2004,10,8);coutd1.yy()/d1.mm()/d1.dd()endl;//调用成员函数}//修改原因:year、month和day都是类的私有成员,所以不能在main函数中使用;在类中定义的公有成员函数yy()、mm()和dd()后,就可以在main函数中访问它的私有成员了。三、实例----栈1、问题:将《数据结构》中的顺序栈定义成类的形式,通过栈来实现进制转换。2、类的定义数据成员:①存放元素的数组(例如:x)②栈顶标志(例如:top)成员函数:①栈的初始化(例如:init)②入栈(例如:push)③出栈(例如:pop)④判断栈空(例如:isempty)3、对象定义:定义一个栈对象,利用该对象中的数据成员来存放进制转换过程中的各个数字;利用栈的成员函数来实现相应的操作。4、主函数从键盘输入一个十进制数,输出对应的八进制。5、程序说明为了简化问题,只考虑将十进制转换为八进制,栈类中没有考虑栈满的情况6、程序组织(P144)方法1:将所有语句写到一个文件中。方法2:文件stack.h是栈的定义,文件stack1.cpp是栈的成员函数实现,文件stack2.cpp使用栈进行数制转换。方法3:将栈的定义和栈的成员函数实现存入C++头文件stack.h中,程序文件stack2.cpp使用栈进行数制转换。7、源程序文件:下面是按方法二来组织的三个文件://文件stack.hclassstack{private:intx[10];inttop;public:voidinit();voidpush(int);intpop();intis_empty();};//文件stack1.cpp#includestack.hvoidstack::init()//初始化堆栈{top=0;}intstack::is_empty()//判断堆栈是否空,空=1{if(top==0)return1;elsereturn0;}voidstack::push(intn)//将n压入堆栈{x[top]=n;top++;}intstack::pop()//弹出栈顶元素{top--;returnx[top];}//文件stack2.cpp#includeiostream.h#includestack.hvoidmain(){intn;stacks;//定义栈对象变量cout输入一个整数:;cinn;s.init();//初始化堆栈while(n){s.push(n%8);//将当前的末位数字入栈n=n/8;}while(!s.is_empty())//堆栈不空时couts.pop();//输出栈顶元素}四、思考:按要求修改上面的程序1、如何实现将十进制转换任意进制?2、为了简化问题,栈类中没有考虑栈满的情况,如何编写判断栈满的成员函数?如何修改主函数?五、实验3(写实验报告)1、实验名称:堆栈类的实现2、实验目的:掌握类定义、对象定义3、实验内容:①定义堆栈类②利用堆栈类实现进制转换
本文标题:c++讲义(4)类与对象的定义
链接地址:https://www.777doc.com/doc-3699717 .html