第10讲对象数组和指针及对象 作为函数参数 教学目的与要求: 了解对象的综合使用。 掌握对象数组和对象指针的使用及对象作为函数参数。 教学内容提要: 1、对象数组; 2、与对象有关指针; 3、对象作为函数参数 教学重点:对象数组、对象指针。 教学难点:对象数组、对象指针 教学进度:P74~P84 教学过程
•教学目的与要求: 了解对象的综合使用。 掌握对象数组和对象指针的使用及对象作为函数参数。 •教学内容提要: 1、 对象数组; 2、与对象有关指针; 3、对象作为函数参数 教学重点:对象数组、对象指针。 •教学难点:对象数组、对象指针。 •教学进度:P74~P84 •教学过程: 第 10 讲 对象数组和指针及对象 作为函数参数
(101对象数组 L声明 类名数组名L素个数] 访问方法: 数组名下标]成员名 3.对象数组的初始化: 口数组中每一个元素对象被创建时,系统都会调用类构造 函数初始化该对象。 口通过初始化列表赋值。 例 Point A2=(Point(1, 2), Point(3, 4); 口如果没有为数组元素指定显式初始值,数组元素便使用 缺省值初始化(调用缺省构造函数)
数组名[下标] . 成员名 1. 声明: 2. 访问方法: 类名 数组名[元素个数]; 3. 对象数组的初始化: 数组中每一个元素对象被创建时,系统都会调用类构造 函数初始化该对象。 通过初始化列表赋值。 例: 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 objl4l 0各元素对象的初值要求为不同的值时,需要声明带形 参(无缺省值)的构造函数。 Point: Point(int x, int y) {X-x;Y=y;} Point obj3: //error Piont obj3=Point(1, 2), Point(3, 4), Point(5,6)) 当数组中每一个对象被删除时,系统都要调用一次析 构函数
不声明构造函数,则采用缺省构造函数。 各元素对象的初值要求为相同的值时,可以声明具有 缺省形参值的构造函数。 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];//error Piont obj[3]={Point(1,2), Point(3,4), Point(5,6)} 当数组中每一个对象被删除时,系统都要调用一次析 构函数。 4.数组元素所属类的构造函数:
5对象组应用举例: 例10.1 #includesiostream. h> Location: Location(int xx, int yy class location public Y Location ( cout<< Constructor Location(int xx, int yy) cLocation() called. <<endl: void Move(int x, int y); int getx return Locatuon: Location int GetY() return Y private: int XY couteapestructor called s <<endl: Location: Location ( {x=Y=0; void Location: Move(int x, int y cout<< Default Constructor called. <<endl: XEX
#include 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 Constructor called."<<endl; } Location::Location(int xx,int yy) { X=xx; Y=yy; cout<< "Constructor called."<<endl; } Locatuon::~Location() { cout<<"Destructor called.“ <<endl; } void Location::Move(int x,int y) { X=x; Y=y; } 例 10.1 5.对象组应用举例:
int main ( cout<<Entering main, <<endl; Location a2= Location(1, 3), Location (4, 5); for(int i=0; i<2; i++) A[i.Move(i+10,+20); cout<<!Exiting main. <<endl return 0: Entering main Constructor called Constructor called Exiting g Destructor called Destructor called
Entering main... Constructor called. Constructor called. Exiting main... Destructor called. Destructor called. 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; }
(10.2与对象有关的指针 指针可以指向任一类型的变量,也可以指向对象。 (L对象的指针 声明一个指针来保存对象的地址,这个指针就是指向 对象的指针,简称对象的指针。对象的指针的声明方 法与普通变量的指针相同 形式如下:类名*对象的指针名 通过对象的指针间接访问对象成员的方式相应地表示为 (对象的指针名)数据成员名 访问数据成员 对象的指针名),成员函数名(参数表)访问成员函数 因为间接访问运算符“”的优先级低于成员选择运 算符“”,所以表达式中对象的指针名两边的圆括号 不能省略
通过对象的指针间接访问对象成员的方式相应地表示为: 因为间接访问运算符“*”的优先级低于成员选择运 算符“.”,所以表达式中对象的指针名两边的圆括号 不能省略。 注 1. 对象的指针 形式如下: 类名 *对象的指针名 声明一个指针来保存对象的地址,这个指针就是指向 对象的指针,简称对象的指针。对象的指针的声明方 法与普通变量的指针相同。 (*对象的指针名).数据成员名 //访问数据成员 (*对象的指针名).成员函数名(参数表)//访问成员函数 指针可以指向任一类型的变量,也可以指向对象。 【10.2 与对象有关的指针】
例如一声明的类 Cylinder,可做如下声明和访间 Cylinder cylinder Cylinder "cylinder=&cylinder (cylinder). setcylinder(2 (20.0,20.0 (cylinder). surfacearea C++语言提供了另一个更常用的方法 表述形式如下 对象的指针名-→>数据成员名;访问数据成员 对象的指针名->成员函数名(参数表);∥访问成员函数 “->”也叫做成员选择运算符,该运算符可 用于通过对象的指针或结构变量的指针来访 问其中的成局 例如一声明的类 Cylinder,也可做如下声明和访问: ylinder cylinder Cylinder *cylinder=&cylinder; cylinder ->setcylinder(200, 20.0); pcylinder->surfacearea;
例如—-声明的类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++语言提供了另一个更常用的方法:
使用对象的指针前也一定要给指针赋一个合法的值 例10.2对象的指针的声明与访问 #includesiostream. h> class date 声明类 public: Date(inty=2001,intm=1,intd=1);∥带默认值的构造函数 - Date ∥析构函数 void setdate( int y,int m,intd);∥用于改变目期的函数 void show Date const; /用于输出日期的函数 private: int year, month, day Date: Date(int y,int m,int d) /实现构造函数
对象的指针的声明与访问 #include 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
year=y; (续) month-m, day=d void date:; set Date(int y,int m, int d)∥实现改变日期的函数 i year=y month=m; day=d; void date:; chordate(0 const∥实现输出日期的函数 cout<<year<“年”<<monh<<“月”<<day<“日”<<end void maino Date date: ∥声明对象 Date pdate=&date; 声明对象
{ 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 show DateD;∥通过对象名访问公有成员函数 pdate-> showDateo;/通过对象的指针访间公有成员函数 date set Dater(2001,630);改变日期值 date. showDateO; pdate->Show Date pdate->setDate(2001, 12, 31) date show Date; pdate->showDateO 2001年1月1日 2001年1月1日 2001年6月30日 2001年6月30日 2001年12月31日 2001年12月31日
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日 (续)