面向对象的程序设计c++类与对象演示课件_第1页
面向对象的程序设计c++类与对象演示课件_第2页
面向对象的程序设计c++类与对象演示课件_第3页
面向对象的程序设计c++类与对象演示课件_第4页
面向对象的程序设计c++类与对象演示课件_第5页
已阅读5页,还剩111页未读 继续免费阅读

下载本文档

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

文档简介

面向对象程序设计第三章 类和对象,杨卫东 左峥嵘华中科技大学 自动化学院,2017秋,作业1,版本,OpenCV库,第3章 类和对象,类与对象的基本概念构造函数与析构函数对象数组与对象指针向函数传递对象对象的赋值和复制静态成员友元类的组合常类型,1、类的定义,类与对象的基本概念,类的定义格式:,class 类名 类头 private: 数据成员或成员函数的说明 protected:类体 数据成员或成员函数的说明 public:数据成员或成员函数的说明 ; ,类的定义,类的定义格式分为说明部分和实现部分说明部分是用来描述该类中的成员,包括数据成员的说明和成员函数的说明,成员函数是用来对数据成员进行操作的,又称为“方法”。实现部分是用来定义(编写)各种成员函数的,以描述这些成员函数是如何实现对数据成员的操作。总之,说明部分将告诉编程者这个类是“做什么”的,而实现部分是告知“怎么做”的。类的说明部分由类头和类体两部分组成类头由关键字class和类名组成,用来向编译系统声明定义了一个新的类型。类名是由编程者启用的一种标识符,一般用C(Class)开头的字符串作为类名,以便与对象名、函数名区别。类体是对类的组织形式进行具体的描述。由访问限制符(private、protected、public)和数据成员、成员函数组成,整个类体用一对大括号包围起来,完整地表达对类的描述。,class允许隐藏内部成员。它是依靠类定义中的三个访问限制符public、private、protected来确定隐藏的程度,它们将类体划分成三大部分:以public:开头的程序部分称为公有部分。 以private:开头的程序部分称为私有部分。以protected:开头的程序部分称为保护部分。 类的定义只是定义了某种类的组织形式,即定义了一个新的class类型,相当于ANSI C中的结构体定义。编译系统并不给class类型的每个数据成员分配内存空间,访问限制符,2.访问限制符public、private、protected 访问限制符将类体分为三个部分,每一部分都可以有数据成员和成员函数,也可以只有数据成员或成员函数,但不同的访问限制符规定了该部分所具有的访问权限。Public访问限制符指定的为公有部分是透明的,它的数据成员和成员函数是开放的,既可以由本类的成员函数访问,也可有程序的其他部分直接访问。例如允许该类的对象去直接访问它的公有部分 即编写成“ 对象名.公有成员名 ”的形式。Private访问限制符指定的为私有部分象一个黑盒子,完全是隐藏的,它只能由本类的成员函数访问,不允许程序其他部分访问,例如不允许该类的对象去直接访问它的私有部分,即不允许编写成“对象名.私有成员”的形式。,访问限制符,Protected访问限制符指定的保护部分是半透明的,它可由本类成员函数或它的派生类成员函数直接访问,但也不允许程序其他部分直接访问它。保护部分主要用于类的继承。,访问限制符,访问限制符使用的一般原则通常总是将数据成员指定为私有的以实现数据隐藏,这些数据成员是用来描述该类对象的属性,编程者无法直接访问它们而隐藏起来。将成员函数指定为公有的,作为该类对象访问私有数据成员的一个接口界面,即对象访问私有数据成员的一条消息通路提供给外界使用。因此私有数据只能通过公有成员函数访问,从而隐藏了处理这些数据的实现细节,使得类对数据的描述和类提供给外部世界来处理数据的界面这两件事情互相独立,这就给出了面向对象的重要特性,使得一个类的用户唯一需要做的事情就是访问类的界面。,Date类的描述,数据成员,定义格式类的定义与结构体的定义一样,仅仅定义了类的组织形式,给出了一个新的class类型,编译系统并不给类的每个数据成员分配具体的内存空间。数据成员既可以放在公有部分称为公有数据成员,又可以放在私有或保护部分称为私有或保护数据成员。定义格式都是: 数据成员名;说明数据成员只有说明,而无说明,所以将类的数据成员说明为auto、register和extern型都是无意义的,在类体中不允许对所定义的数据成员进行初始化class Counterpublic : .private :unsigned value = 0; /error;数据成员的类型可以是基本数据类型(char、int、.、double等)和复杂数据类型(数组、指针、引用、.、结构变量等),或已经定义了的类对象。当另一个类的对象作为这个类的成员时,称为“对象成员”,这另一个类必须预先定义好。,class N public : .;/不能采用先声明,后定义的形式。”class N;”class M public : . private : N n; / n是N类的对象; Tpoint.cpp,成员函数的定义,成员函数(Member Function)定义格式:说明: 所有成员函数都必须在类体内用函数原型加以声明;成员函数的定义(方法的实现部分)既可在类体外定义,也可在类体内定义。在类体外定义成员函数时,必须用类名加作用域运算符:来指明所定义的成员函数属于哪个类;在类体内定义的成员函数,其函数头可不写 : 。,在类体内定义成员函数时,编译系统自动地将成员函数当作内联函数处理,其函数头前不必写关键字”inline”。例如Counter类中的Increment()、Decrement()和 ReadValue()都是内联函数。若是类体外定义的成员函数,必须用关键字”inline”指明它为内联函数。在定义了类的对象后,才可以用如下格式调用:对象名.成员函数名(实参表);例如: Counter c1, c2; c1.Increment( ); c2. Decrement( );成员函数与普通函数一样,可设置参数的默认值(缺省值Default) ch3-cpp-complex.dsw,对象的定义,对象的定义格式:在定义好称之为“类名”的一个类以后,就可以用如下格式定义它的对象: ;中可以有一个或多个对象名,若为多个对象名时用逗号分隔开。 一般对象名: Date d1,d2; 对象数组名: Date d31; 对象指针名: Date *ptr; 对象引用名: Date d1,对象的定义,指向对象的指针对象指针的定义格式: 指针名;例如:Counter c1 ,c2 ,*pc;这里所说的是指针变量本身的存储类型,与ANSI C标准一样,有extern型、static型、auto型等。而auto的说明经常缺省,extern在定义时不写,声明时必须写。例中只定义了一个对象指针pc,但pc并没有定向,还必须通过初始化或赋值操作将已存在的对象地址赋给它。即pc = 另外,在C+中对象指针可作为另一个类的成员,此时的对象指针是没有说明的。,只要一个类已经声明(可以没有定义),则指向该类的对象指针或该类对象的引用都可作为另一个类的成员。,构造函数与析构函数,1)构造函数2)析构函数3)重载构造函数和拷贝构造函数,构造函数与析构函数,对象的初始化与构造函数“类”是一种抽象的数据类型。要使用这个类还必须用“类”说明它的对象,每个对象中的数据成员还必须赋初值,即对象的初始化对象的初始化由构造函数完成变量,存储空间 MyImg.cpp,构造函数与析构函数,构造函数是一种特殊的成员函数,以类名作为函数名不能指定返回类型和显式的返回值,连void都不能写,即无返回类型可以有任意类型的参数对象定义时被编译系统自动调用:若某类定义了构造函数,则每当该类的对象创建时,编译系统为它的对象分配内存空间,并自动调用构造函数初始化所创建的对象,从而确保每个对象自动地初始化构造函数为公有,用户不能显示调用。构造函数只完成新对象的初始化工作,不执行对象的主要任务。即在类创建新对象时,为对象分配内存空间,给数据成员赋初值可以类内定义,亦可类外定义 complex.dsw,构造函数与析构函数,构造函数每个类可定义多个构造函数,实现构造函数的重载,以适应创建对象时,对象的参数具有不同个数的情况。实际应用中,通常需要给每个类定义构造函数,如未定义,编译系统自动生成一个默认的构造函数, 如: complex:complex( ) (tpoint1.cpp)用默认构造函数创建对象时,若创建的是全局对象或静态对象,则对象的所有数据成员都初始化为零(数)或空(字符串),采用构造函数对数据成员赋初值的形式形式1:直接创建对象类名 对象名(实参表);如:complex cp(1.0, 2.0);形式2:通过指针和new来创建对象时类名 * 指针变量名 = new 类名(实参表);如:complex* pt=new complex(1.0, 2.0);,构造函数的重载构造函数之间以它们所带参数的个数和类型的不同而区分说明无参构造函数创建对象时,应该用语句”Data date1;”, 不能用”Data data1( );”只要定义了一个构造函数,系统将不再提供默认的构造函数;类中可包含多个构造函数,但对于对象而言,建立对象时只执行其中的一个。Complex.cpp,带有默认参数的构造函数若构造函数在类的声明外定义,则默认参数需在类内声明构造函数原型时指定;若构造函数的全部参数都指定了默认值,则在定义对象时可以指定1个或多个实参,也可以不给出实参,这时的构造函数也属于默认构造函数,不能再声明无参数的默认构造函数;若构造函数的全部参数都指定了默认值,则不能再定义重载构造函数; ?Complex(double r=0.0, double i=0.0);Complex(double r);,用成员初始化列表对数据成员初始化不在函数体内用赋值语句对数据成员初始化,而在函数首部实现的。带有成员初始化列表的构造函数的一般形式: 类名:构造函数名(参数表):(成员初始化列表)成员初始化列表的一般形式: 数据成员名1(初始值1), 数据成员名2(初始值2),构造函数可使用构造初始化表对数据成员进行初始化class Aint i;char c; public: / 下面为构造函数A(int i1,char c1) i=i1;imag=i;A(int i1,char c1):i(i1),c(c1) ;,为什么使用初始化列表使用初始化列表主要是基于性能问题,对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表某些情况下必须使用初始化列表常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面引用类型成员,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面成员变量的初始化顺序成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的,析构函数,析构函数的作用:执行清理任务,释放空间析构函数也是一种特殊的成员函数和构造函数名相同,但其前有波浪号无参数,无返回值,不能重载,因此类中只有一个析构函数当撤销对象,编译系统会自动调用析构函数,程序员不能显示调用类只有一个,若未显式定义,编译系统自动生成默认的析构函数,class complexdouble real;double imag; public:complex(double r=0.0,double i=0.0) real=r; imag=i; / 定义一个析构函数complex() cout数据成员名或 对象名-成员函数名(实参表)通过对象的引用访问对象中的成员 引用对象名.数据成员名或 引用对象名.成员函数名(实参表)私有数据成员的访问通过公用成员函数进行访问,重载构造函数,与一般成员函数一样,C+运行重载构造函数,重载的方法一样class A/ public:A(); / 重载构造函数A(int);A(int,char);A(float,char);/ ;,拷贝构造函数,拷贝构造函数是一种特殊的构造函数它用于根据存在对象建立新对象,它能把存在对象的值逐域拷贝到新对象中。拷贝构造函数的特点: 1)该函数只有一个参数,其形参是同类对象的引用 2)每个类都有一个拷贝构造函数。若未显式地定义它,编译系统也会自动生成。,拷贝构造函数的定义形式: classname (const classname,调用拷贝构造函数的方法代入法类名 对象名2(对象 1)Point p2(p1);赋值法对象2 = 对象1;Point p2=p1;,调用拷贝构造函数的3种情况用类的一个对象去初始化该类的另一个对象Point p2(p1);Point p2 = p1;当函数的形参是类的对象,在调用函数进行形参和实参结合时Void fun1(Point p) p.print();Int main() Point p1(10,20); fun1(p1); return 0; ,调用拷贝构造函数的3种情况当构造函数的返回值是类的对象,在函数调用完毕将返回值(对象)带回函数调用处时Point fun2() Point p1(10,20); return p1; Int main() Point p2; p2 = fun2(); return 0; ,对象数组,与C的变量数组是相同的即用类来声明对象的数组#include iostream.h“class examint x;public:void set_x(int n)x=n;int get_x()return x;,对象数组,void main()exam ob4; / 对象数组的定义和使用for(int i=0;i4;i+) obi.set_x (i);for(i=0;i4;i+) coutobi.get_x ()get_x();指针变量必须指向实体变量后才能使用!,对象指针,实体对象使用“.”运算符操作其成员,而对象指针使用“-”(箭头运算符)来使用其所指向对象的成员。对象指针最常用的是引用对象数组 如:exam ob4, *pe; pe=ob; pe+;/对象指针使用 pe-get_x();/对象数组,对象指针,C+提供的一个特殊对象指针this指针是一种隐含指针,每个成员函数都有一个this指针,用来标记成员函数操作哪个对象的数据成员。this是为了实现代码共享C+和C一样:函数的作用是减少代码开销。C+的类的对象占有自己的内存空间;但并不是每个对象有自己的代码,一个类的所有对象共用类的代码!,class stack char data100; char *top; public: void push(char c) / char pop() / ; Stack s1;Stack s2;,数据区,s1.pop();,s2.pop();,this是隐含的指针(可以省略)char stack:pop() return *(-top); 或者是 return *(-this-top); 编译器工作机理C+编译器把s1.pop()变成pop(&s1)编译器把声明char stack:pop()变成char pop(stack* this),向函数传递对象,对象可以作为参数传递给函数,其方法与传递其他类型的数据相同。向函数传递对象有三种方法: 1)传值进行实参和形参对象的拷贝 2)传址把实参的地址传递给形参指针,通过指针操作实参3)传引用形参生成为实参的“别名”,通过形参别名来操作实参,其作用和指针一样,传值参数传值是实参数值的拷贝,而不是参数本身传址传递对象的地址传引用形参为对象的别名举例 fun_para.cpp,静态成员-静态数据成员,类中成员(成员函数和数据成员)前用“static”修饰即成为静态成员特征:静态成员不管类创建了多少个对象,静态成员只有一个拷贝!(编译器要特殊处理预先生成)举例:Student.cpp,class student public: static int count; / ; int student:count=0; /无论student创建多少个实例,count将严格只存放一个拷贝。由于这种静态类成员独立于任何类对象存在,用:定义,而无需引用对象。static 成员和整个程序作业一样持久,但作用域仅限于此类。另外,它的访问也是受控的(公有、私有、保护的),静态数据成员的初始化静态数据成员的初始化在类外进行, 并在定义对象之前,一般在主函数main()之前, 初始化的格式: 数据类型 类名:静态数据成员名 = 初始值不管它是公有的、私有的还是保护的,都必须在所有函数以外进行初始化,否则将产生连接(linking)错误静态数据成员的访问独立于对象之外, 采用: 类名:静态数据成员名也可通过对象名访问: 对象名.静态对象数据成员名 对象指针-静态数据成员名静态数据成员也可设定访问限制, 私有的静态数据成员不能被类外直接访问.,静态成员函数,用static修饰的成员函数即是静态成员函数静态成员函数只可以引用属于该类的静态数据成员或静态成员函数 类外代码用类名和作用域分辨符调用,无需引用具体实例,甚至类实例可以不存在。私有静态成员函数不能被类外部的函数和对象访问,#include class student private: static int count; public: student( ) +count; student( ) -count; static int getCount( ) return count; ; int student:count=0;,静态成员函数与非静态成员函数的区别静态成员是类的一部分, 而不是对象的一部分;非静态成员函数有this指针,静态函数没有;静态函数只能访问本类中的静态数据成员, 不能直接访问非静态数据成员, 非静态函数均可访问.静态成员函数可通过对象名访问该对象的非静态成员为什么要使用静态成员函数在建立任何对象之前, 通过静态成员函数对静态数据成员进行处理编译系统将静态成员函数限定为内部连接, 与现行文件相连接的其他文件中的同名函数不会与该函数发生冲突,维护了该函数的安全性.,若定义了向量类Vector和矩阵类Matrix,各类都隐藏了私有数据成员,并提供了完整的操作函数。为简单起见,假设向量有3个元素,下标为0、1、2。而矩阵包含3行*3列=9个元素,下标都是0、1、2。若要定义一个矩阵乘向量的函数multiply( ),首先想到的方法是将它定义成外部函数,由Vector类和Matrix类共享它,此时在Vector类和Matrix类定义中,必须分别提供通过下标来访问各自元素的成员函数elem( )。,class Vector double v3;public: /读向量v的第i号元素 double elem(int i)return vi; void set(int i, double x) vi = x;class Matrix double m33;public: /读矩阵m的第i行第j列的元素 double elem(int i,int j) return mij; ;,矩阵m33乘向量v3的运算法则如下: m00 m01 m02 v0 m00v0 + m01v1 + m02v2 m10 m11 m12 v1 = m10v0 + m11v1 + m12v2 m20 m21 m22 v2 m20v0 + m21v1 + m22v2其结果矩阵(向量)r的第i行应为:ri= 2j=0 mij*vj; i = 0,1,2若将multiply( )定义为外部函数,则可写为:,Vector multiply(const Matrix n = 3(Vector类),由于multiply( )为非成员函数,不能直接访问 Matrix类对象m和Vector类对象v的私有数据成员,只有通过各自的成员函数Vector:elem(int i)和Matrix:elem(int i, int j)访问。每当调用一次multiply( )函数,Vector类的elem( )要调用n2 + n = 3*(3+1)=12次,式中n为向量的元素个数。Matrix类的elem( )要调用n2=32=9次,从而产生很大的调用开销,直接影响了程序的运行效率,特别当n增加时,调用次数将大幅度增加。如果把multiply( )定义成友元函数,可以有限制地实现对类的私有部分和保护部分的直接访问,不必再定义各自的成员函数elem( )。,友元函数,友员给予别的类或非成员函数访问私有成员权利。在此类中用关键字friend声明,公有或私有区声明都行。,函数作为友元: class t1 private: int data; friend void friend_t1( t1 fri ); public: t1( ) data=12; void use_friend(); ; void friend_t1( ti fri ) /外部函数 fri.data=10; ,友员不是成员不能用this指针访问它。,void t1:use_friend( ) t1 fri; this-friend_t1(fri); / 这是不正确的! :friend_t1(fri); / 这是合法的! void main( ) t1 fri, fri1; fri.friend_t1( fri ); / 这也是不正确的! friend_t1(fri); ,友元成员和友元类,一个类(或类的成员)可以作为别的类的友元,class x public: void f( );private: int i; ;class y friend void x:f( ); int i; public: / ;void x:f( ) y yi; yi.i=10; ,class x public: void f( );private: int i; ;class y friend x; int i; public: / ;void x:f( ) y yi; yi.i=10; ,友元关系是单向的,不具有交换性友元关系不具有传递性 类A是类B的友元 类B是类C的友元 类A是类C的友元,类的组合-对象成员,当一个类的对象作为另一个类的成员时,该对象称为对象成员,或子对象,这另一个类称为容器类(Container Class),这种方法称为组合技术。对象成员的初始化当创建容器类的对象时,对象成员所需的参数初始化机制由容器类的构造函数提供,这是在它的构造函数头内,为成员对象指定一个初始化参数表来完成的,其格式为:容器类(构造函数)名(参数表) : 成员对象名1(参数表1), 成员对象名2(参数表2),. 其中参数表1,参数表2,.为成员对象所属类相对应的构造函数参数表。,class X 类名1 对象成员1; 类名2 对象成员2; / ;对于上面的类,其构造函数一般为X:X(参数表0):对象成员1(参数表1),对象成员2(参数表2) /foo.cpp,#include class foo int i;public : foo( ) i = 0; ;class bar int i;public : bar(int x) i = x; int get( ) return i; ;,class Snafu foo f; bar b1; bar b2;public : /空函数 Snafu( ) : f( ), b1(1), b2(2) void read1( ) cout b1 of obj = b1.bar:get( ) endl; void read2( ) cout b2 of obj = b2.bar:get( ) 对象成员所属的类名: 成员函数名(实参表);,#include class Point public : Point(int xi, int yi) x = xi; y = yi; Point(Point ,class Circle public : Circle(int x1, int y1, int r) : center(x1, y1) radius = r; int GetRad( ) return radius; int GetcenterX( ) return center.Point:Xcoord( ); int GetcenterY( ) return center.Point:Ycoord( ); private : Point center; int radius;,void main( ) Point pnt(160, 180), * bp; Circle spotlight(320, 240, 40), * dp; bp = 该程序的输出结果:(1)pnts X = 160 Y = 180(2)spotlights X = 320 Y = 240 radius = 40,对象的赋值和复制,对象间赋值(=)是一个拷贝过程浅拷贝实现对象间数据元素的一一对应复制深拷贝当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指的对象进行复制系统提供的拷贝(如默认拷贝构造函数等)只能实现浅拷贝,深拷贝必须自定义,拷贝,当类中有指针数据成员时,并且为其开辟了空间,浅拷贝会出现问题!程序使用了系统默认的拷贝构造函数 Student stu2(stu);默认拷贝构造函数完成stu到stu2的逐位复制(浅拷贝)浅拷贝在对象释放时会出现问题,拷贝,问题原因二个对象name指向同样内存,stu1调用析构函数后,name指向内存释放(delete),那么stu2调用析构函数释放谁呢?问题解决自定义拷贝构造函数(或赋值运算符),自定义完成过程即为深拷贝!对象的赋值:调用的是C+自带的operator = () 或者用户重载的等号操作函数。对象初始化:使用缺省构造函数或缺省复制构造函数。,拷贝前,拷贝后,nameage,stu1,stu1和stu2的name指针指向同样的字符数组元素占用的内存!,nameage,stu2,逐位拷贝二者相等,拷贝,拷贝,拷贝前,拷贝后,nameage,stu1,nameage,stu2,把指针指向内容也复制,对象数组,对象数组在ANSI C中,把具有相同结构类型的结构变量,有序地集合起来便组成了结构数组。在ANSI C+中,与此类似将具有相同class类型的对象有序地集合在一起便组成了对象数组,对于一维对象数组也称为“对象向量”,因此对象数组的每个元素都是同种class类型的对象。定义格式为: 对象数组名元素个数。 = 初始化列表;其中是对象数组元素的存储类型,与变量一样有extern型、static型和auto型等,该对象数组元素由指明所属类,与普通数组类似,方括号内给出某一维的元素个数。对象向量只有一个方括号,二维对象数组有两个方括号,如此类推。,#include class Point int x, y;public : Point(void) x = y = 0; Point(int xi, int yi) x = xi; y = yi; Point(int c) x = y = c; void Print( ) static int i = 0 ; cout P i+ ( x , y )n;,void main( ) Point Triangle3 = Point(0, 0), Point(5, 5), Point(10, 0); int k = 0; cout输出显示第 +k个三角形的三顶点:n; for(int i = 0; i 3; i+) Trianglei.Print( ); Triangle0 = Point(1); Triangle1 = 6; /Call Point(6) Triangle2 = Point(11, 1); cout输出显示第+k 个三角形的三顶点:n; for(i = 0; i 3; i+) Trianglei.Print( ); ,Point Rectangle22=Point(0, 0),Point(0,6) ,Point(16,6),Point(16,0);cout 输出显示一个矩形的四顶点 : n;for(i = 0; i 2 ; i+)for(int j = 0; j 2; j+) Rectangleij.Print( );cout输出显示45度直线上的三点 : n;Point Line453 = 0, 1, 2;for(i = 0; i 3; i+) Line45i.Print( );Point PtArray3;cout 输出显示对象向量PtArray的三元素 : n;for(i = 0; i 3; i+) PtArrayi.Print( );,该程序的输出结果:输出显示第1个三角形的三顶点 :P0(0 , 0)P1(5 , 5)P2(10 , 0)输出显示第2个三角形的三顶点 :P3(1 , 1)P4(6 , 6)P5(11 , 1)输出显示一个矩形的四顶点 :P6(0 , 0)P7(0 , 6)P8(16 , 6)P9(16 , 0),输出显示45度直线上的三点 :P10(0 , 0)P11(1 , 1)P12(2 , 2)输出显示对象向量PtArray的三元素 :P13(0 , 0)P14(0 , 0)P15(0 , 0),对象数组的初始化当对象数组所属类含有带参数的构造函数时,可用初始化列表按顺序调用构造函数初始化对象数组的每个元素。如上例中: Point Triangle3 = Point(0, 0), Point(5, 5),Point(10, 0); Point Rectangle22 = Point(0, 0), Point(0, 6),Point(16,6),Point(16,0);也可以先定义后给每个元素赋值,其赋值格式为: 对象数组名行下标列下标=构造函数名(实参表);,例如:Rectangle00 = Point(0, 0); Rectangle01 = Point(0, 6);Rectangle10 = Point(16, 6);Rectangle11 = Point(16, 0); 若对象数组所属类含有单个参数的构造函数时;如上例中”Point(int c);”,该构造函数置x和y为相同的值。那么对象数组的初始化可简写为:Point Line453 = 0, 1, 2;Point Triangle3 = 0,/Call Point(0) 5,/Call Point(5) Point(10, 0);,Point Triangle3 = Point(0, 0), Point(5, 5),Point(10, 0);Triangle0 = Point(0, 0);Triangle1 = Point(0, 0);Triangle2 = Point(0, 0);?,对象数组创建时若没有初始化列表,其所属类中必须定义无参数的构造函数,在创建对象数组的每个元素时自动调用它。如上例中在执行 “Point PtArray3;”语句时,调用Point(void),初始化对象数组PtArray 的每个对象为(0,0)。如果对象数组所属类含有析构函数,那末每当建立对象数组时,按每个元素的排列顺序调用构造函数,每当撤消数组时,按相反的顺序调用析构函数。,#include #include class Personal char name20;public :Personal(char * n) strcpy(name , n); cout name says hello !n; Personal(void) cout name says goodbye !n; ;void main( )cout 创建对象数组,调用构造函数 :n;Personal people3 = Wang, Li, Zhang; cout 撤消对象数组,调用析构函数 :n;,该程序的输出结果为:创建对象数组,调用构造函数 :Wang says hello !Li says hello !Zhang says hello !撤消对象数组,调用析构函数 :Zhang says goodbye !Li says goodbye !Wang says goodbye !,对象的存储类,与基本数据类型的变量一样,对象在定义时也必须指明它的存储类。自动(auto型)对象、外部(extern型)对象、静态(static)对象和动态对象(又称堆对象,即使用new和delete运算符创建和撤消的对象)。不同存

温馨提示

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

评论

0/150

提交评论