课件第10讲对组和指针_第1页
课件第10讲对组和指针_第2页
课件第10讲对组和指针_第3页
课件第10讲对组和指针_第4页
课件第10讲对组和指针_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

教学目的与要求:了解对象的综合使用。掌握对象数组和对象指针的使用及对象作为函数参数。教学内容提要:1、对象数组;2、与对象有关指针;3、对象作为函数参数教学重点:对象数组、对象指针。教学难点:对象数组、对象指针。教学进度:P74~P84教学过程:第10

讲对象数组和指针及对象作为函数参数声明:类名数组名[元素个数];访问方法:数组名[下标] .

成员名对象数组的初始化:数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。通过初始化列表赋值。例:Point

A[2]={Point(1,2),Point(3,4)};如果没有为数组元素指定显式初始值,数组元素便使用缺省值初始化(调用缺省构造函数)。【

10.1

对象数组】4.数组元素所属类的构造函数:不声明构造函数,则采用缺省构造函数。各元素对象的初值要求为相同的值时,可以声明具有缺省形参值的构造函数。Point::Point(int

x=0,int

y=0){

X=x;

Y=y;}Point

obj[4];各元素对象的初值要求为不同的值时,需要声明带形参(无缺省值)的构造函数。Point::Point(int

x,int

y){

X=x;

Y=y;}Point

obj[3];//errorPiont

obj[3]={Point(1,2),

Point(3,4),

Point(5,6)}当数组中每一个对象被删除时,系统都要调用一次析构函数。Location::Location(int

xx,int

yy){

X=xx;Y=yy;cout<<

"Constructorcalled."<<endl;}Locatuon::~Location(

){cout<<"Destructor

called.“<<endl;}void

Location::Move(int

x,int

y){X=x;Y=y;}例10.1#include<iostream.h>class

Location{

public:Location(

);Location(int

xx,int

yy);~Location(

);void

Move(int

x,int

y);int

GetX(

{return

X;}int

GetY(

{return

Y;}private:int

X,Y;};Location::Location(

){

X=Y=0;cout<<"Default

Constructorcalled."<<endl;}5.对象组应用举例:int

main(

){cout<<"Entering

main..."<<endl;Location

A[2]={Location(1,3),Location(4,5)};for(int

i=0;i<2;i++)A[i].Move(i+10,i+20);cout<<"Exiting

main..."<<endl;return

0;}Entering

main...Constructor

called.Constructor

called.Exiting

main...Destructor

called.Destructor

called.指针可以指向任一类型的变量,也可以指向对象。1.对象的指针声明一个指针来保存对象的地址,这个指针就是指向对象的指针,简称对象的指针。对象的指针的声明方法与普通变量的指针相同。形式如下:类名*对象的指针名通过对象的指针间接访问对象成员的方式相应地表示为:(*对象的指针名).数据成员名

//访问数据成员(*对象的指针名).成员函数名(参数表)//访问成员函数注因为间接访问运算符“*”的优先级低于成员选择运算符“.”,所以表达式中对象的指针名两边的圆括号不能省略。【

10.2

与对象有关的指针】例如—-声明的类Cylinder,可做如下声明和访问:Cylinder

cylinder1;Cylinder

*pcylinder=&cylinder1;(*pcylinder).setcylinder(20.0,20.0);(*pcylinder).surfacearea();表述形式如下:对象的指针名->数据成员名;

//访问数据成员对象的指针名->成员函数名(参数表);//访问成员函数“->”也叫做成员选择运算符,该运算符可用于通过对象的指针或结构变量的指针来访问其中的成员。例如—-声明的类Cylinder,也可做如下声明和访问:Cylinder

cylinder1;Cylinder

*pcylinder=&cylinder1;pcylinder

->setcylinder(20.0,20.0);pcylinder->surfacearea();C++语言提供了另一个更常用的方法://声明类class

Date{public:Date(int

y=2001,int

m=1,int

d=1); //带默认值的构造函数//析构函数//用于改变日期的函数//用于输出日期的函数~Date(){}void

setDate(int

y,int

m,int

d);void

showDate()

const;private:int

year,month,day;};Date::Date(int

y,int

m,int

d)//实现构造函数使用对象的指针前也一定要给指针赋一个合法的值。例10.2

对象的指针的声明与访问#include<iostream.h>{

year=y;month=m;day=d;}void

Date::setDate(int

y,int

m,int

d)//实现改变日期的函数{

year=y;month=m;day=d;//实现输出日期的函数}void

Date::showDate()

const{cout<<year<<“年”<<month<<“月”<<day<<“日”<<endl;}void

main(){Date

date;Date

*pdate=&date;//声明对象//声明对象的指针(续)date.showDate();pdate->showDate();//改变日期值date.setDate(2001,6,30);date.showDate();pdate->showDate();pdate->setDate(2001,12,31);date.showDate();pdate->showDate();}2001年1月1日2001年1月1日2001年6月30日2001年6月30日2001年12月31日2001年12月31日(续)//通过对象名访问公有成员函数//通过对象的指针访问公有成员函数由于this指针的隐含性,在一般情况下并不需要显式标明。注调用一个对象的成员函数时,编译系统会首先将这个对象的地址赋给被调用的成员函数中的this指针,然后再调用成员函数。成员函数访问数据成员时就隐含地使用this指针来确保访问到的数据成员属于这个对象。2.

this指针比如:

Date::Date(int

y,int

m,int

d){this->day=d;}this->year=y;this->month=m;说明:显式使用了this指针,明确地表示出成员函数当前所操作的数据成员所属的对象。this指针也是一个指向对象的指针,它隐含在类成员函数中,用来指向成员函数所属类的正在被操作的对象。this指针的使用//声明类#include<iostream.h>class

Date{public:Date(int

y=2001,int

m=1,int

d=1);//带缺省值的构造函数~Date(){} //析构函数void

setDate(int

y,int

m,int

d);//用于改变日期的函数//用于输出日期的函数void

showDate()

const;private:int

year,month,day;};//实现构造函数Date::Date(int

y,int

m,int

d){this->year=y;//显式使用this指针this->month=m;

//this指针指向正在被操作的对象例10.3this->day=d;}void

Date::setDate(int

y,int

m,int

d) //实现改变日期的函数//显式使用this指针//this指针指向正在操作的对象{

this->year=y;this->month=m;this->day=d;}void

Date::showDate()const //实现输出日期的函数{

cout<<this->year<<“年”<<this->month<<“月”<<this->day<<“日”<<endl;}void

main(){Date

date(2001,1,1);Date

*pdate=&date;date.showDate();pdate->showDate();//声明对象//声明对象的指针//通过对象名访问公有成员函数//通过对象的指针访问公有成员函数date.setDate(2001,6,30); //改变日期(续)date.showDate();date.showDate();pdate->showDate();}注静态成员函数没有this指针3.

指向类成员的指针类中的数据成员和成员函数在类实例化后在内存中也有一定的存储地址,可以声明指向类成员的指针。通过这些指针,可以访问对象的成员。指向成员函数的指针(简称成员函数指针)指向类成员的指针指向数据成员的指针(简称数据成员指针)pdate->showDate();pdate->setDate(2001,12,31);说明:显式使用this指针所完的任务都可以由系统隐含完。(续)在这里赋值也就是确定指针指向类中的哪一个成员。对于数据成员指针,赋值的形式如下:数据成员指针名=&类名::数据成员名对于下面声明的类A

比如,

class

A{

public:...int

a;...};数据类型是指数据成员指针所指向的数据成员的类型。类名是数据成员所属类的名称。在使用前必须声明并赋值声明一个数据成员指针的形式如下:数据类型

类名::*数据成员指针名;int

A::*p=&A::a;等价int

A::*p;p=&A::a;由于类本身是一个类型,不是变量,系统并不为类分配内存。在声明

了指向类成员的指针后,还需要指定该类的一个对象来实例化这个类。注在使用时还必须通过指定的对象名或指向这个对象的指针来访问数据成员指针所指向的成员。访问数据成员的表述形式如下:对象名.*类成员指针名对象指针名->*类成员指针名//通过对象名访问//通过对象的指针访问可以用下式声明指向这个类的数据成员a的指针p。数据成员指针的使用//声明类//EXAMPLE4_6.H#include<iostream.h>class

A{public:A(double

x1=0.0,double

y1=0.0);~A(){}void

setxy(double

x1,double

y1);void

outputxy()const;double

x;private:double

y;};//EXAMPLE4_6.CPP#include″EXAMPLE4_6.H″A::A(double

x1,double

y1):x(x1),y(y1){}例10.4void

A::setxy(double

x1,double

y1){x=x1;y=y1;}void

A::outputxy()

const{cout<<″x=\t″<<x<<″\ty=\t″<<y<<endl;}voidmain(){A

a(1.5,2.6),*pa=&a;

//声明类A的对象a及指针pa,并让对象pa

指向adouble

A::*px=&A::x;a.outputxy();//声明指向类A的double型数据成员的指针//并使其指向公有成员x//调用成员函数输出cout<<″a.x=\t″<<a.x<<endl;

//利用对象名直接访问成员xcout<<″a.*px=\t″<<a.*px<<endl;

//利用对象名和数据成员指针//间

接访问xcout<<″pa->*px=\t″<<pa->*px<<endl;

//利用对象的指针和//成员指针间接访问x}(y=2.6x=

1.5a.x=

1.5a.*px=

1.5pa->*px=

1.5例10.5#include<iostream.h>class

Point{

public:Point(

){

X=Y=0;

cout<<"Default

Constructorcalled.\n";}Point(int

xx,int

yy);{ X=xx;

Y=yy;

cout<<

"Constructorcalled.\n";

}~Point(

{ cout<<"Destructor

called.\n";

}int

GetX(

{return

X;}int

GetY(

{return

Y;}void

Move(int

x,int

y){

X=x;

Y=y;

}private:int

X,Y;};void

main(

){ cout<<"Step

One:"<<endl;Point

*Ptr1=new

Point;delete

Ptr1;cout<<"Step

Two:"<<endl;Ptr1=new

Point(1,2);

delete

Ptr1;}运行结果:Step

One:Default

Constructor

called.Destructor

called.Step

Two:Constructor

called.Destructor

called.{

//类的声明同例,略};void

main(

){ Point

*Ptr=new

Point[2];//创建对象数组Ptr[0].Move(5,10);Ptr[1].Move(15,20);//通过指针访问数组元素的成员//通过指针访问数组元素的成员cout<<"Deleting..."<<endl;}delete[]Ptr;

//删除整个对象数组运行结果:Default

Constructor

called.Default

Constructor

called.Deleting...Destructor

called.Destructor

called.例10.6#include<iostream.h>class

Point【10.3

向函数传递对象】10.3.1

使用对象作为函数参数例10.7#include<iostream.h>class

aClass{public:aClass(int

n)

{

i=n;

}void

set(int

n){

i=n;

}int

get(

){

return

i;

}private: int

i;};void

sqr(aClass

ob){

ob.set(ob.get()*ob.get());cout<<"copy

of

obj

has

i

value

of

";cout<<ob.get()<<"\n";}void

main(){

aClass

obj(10);sqr(obj);cout<<"But,

obj.i

isunchanged

in

main:";cout<<obj.get(

);}10.3.2

使用对象指针作为函数参数例10.8#include<iostream.h>class

aClass{

public:aClass(int

n)

{

i=n;

}void

set(int

n){

i=n;

}int

get(){

return

i;}pr

温馨提示

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

评论

0/150

提交评论