C++教程第07章 类与对象-3对象的初始化、构造

上传人:油条 文档编号:28518789 上传时间:2018-01-17 格式:DOC 页数:9 大小:78KB
返回 下载 相关 举报
C++教程第07章 类与对象-3对象的初始化、构造_第1页
第1页 / 共9页
C++教程第07章 类与对象-3对象的初始化、构造_第2页
第2页 / 共9页
C++教程第07章 类与对象-3对象的初始化、构造_第3页
第3页 / 共9页
C++教程第07章 类与对象-3对象的初始化、构造_第4页
第4页 / 共9页
C++教程第07章 类与对象-3对象的初始化、构造_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《C++教程第07章 类与对象-3对象的初始化、构造》由会员分享,可在线阅读,更多相关《C++教程第07章 类与对象-3对象的初始化、构造(9页珍藏版)》请在金锄头文库上搜索。

1、1第 7 章 类与对象71 类和对象72 成员函数的重载73 对象的初始化、构造函数与析构函数731 基本概念及定义 1. 对象的 4 种初始化方法在使用对象中的成员数据之前,必须赋给它们确定的值;即在使用对象之前,首先要对对象中的成员数据进行初始化。在定义类时不能对类中的成员数据直接初始化,但在创建对象时,可借助 4 种方法进行初始化。1) 初始化列表法。这种方法只能对公有成员数据初始化,对私有和保护类的数据无能为力。由于对象的封装性要求将类的成员数据都定义为私有的,因此这种方法不常用。2) 通过赋值语句来实现,即将一个已经初始化的对象赋给要初始化的对象。如前例。3) 在类中定义一个成员函数

2、,该成员函数能够对对象的成员数据进行设置,如前例。4) 通过构造函数来进行初始化,它的特点是在创建对象的同时自动对对象中的成员数据进行初始化。2 构造函数C+规定与类同名的成员函数是构造函数,它是一个特殊的成员函数。构造函数的一般格式为:() - - - 例如:class CSimpleString char *string ;int length ;public:CSimpleString (int) / string = 0 ; length = a ; ;也可以:class CSimpleString char *string ;int length ;public:CSimpleStr

3、ing (int); /声明构造函数2;CSimpleString :CSimpleString (int) /定义构造函数 string = 0 ; length = a ;构造函数具有如下特征:1). 构造函数与类同名;2).构造函数没有返回值,在声明和定义构造函数时,不能说明它的返回类型,即使void 类型也不行。3). 在创建对象时,首先调用该对象的构造函数,完成对该对象的初始化工作。对构造函数的调用是隐性的,由编译系统自动调用。4). 在创建对象的引用时,由于它只是另一个对象的别名,此时不会调用构造函数。同样,在创建指针时,也不会调用构造函数,但用 new 运算符或其它方法对它初始化

4、时,调用构造函数。5). 如果在类中定义了构造函数,则自动调用该类中定义的构造函数,否则,为了逻辑上的完整性,编译系统会自动产生一个默认的构造函数,其格式为: () 此构造函数,并没有对对象种的成员数据做任何的初始化工作。调用默认的构造函数后,对象中的数据是不确定的,还必须采用其它方法对对象中的成员数据进行初始化。6). 构造函数的重载与普通函数一样。一个类可以有多个构造函数,这样使类具有更大的灵活性,可以根据不同的要求进行不同的初始化。 构造函数的调用1)在创建对象时可以向构造函数传递实参,一般格式: (实参表) ;其中为向构造函数传递的参数。该实参表必须与某个构造函数的参数的类型和个数一致

5、。2). 如果在创建对象时没有向构造函数向构造函数传递实参,则对象后面不能加括号。2 析构函数撤消对象时,会自动调用析构函数,析构函数常承担撤消对象后的善后处理工作。它也是一个特殊的成员函数。 析构函数的格式为: ( ) - - - 特征:1)函数名为类名前加字符“ ” 。2)没有参数,也没有返回类型。因此它不能重载。3)当撤消对象时自动调用析构函数。4)当没有定义析构函数时,系统会自动产生析构函数,该函数为空函数,并不做任何工作。撤消对象的两种方式:1)自动撤消对于局部自动类型的对象,当超出其作用域,对象将自动撤消;3对于全局和静态类型的对象,当程序终止时自动撤消对象;对临时对象,在该对象参

6、与运算之后立即撤消;析构函数的调用顺序正好与构造函数相反。2)主动撤消即当用 new 运算符为对象指针动态分配存储空间,而用 delete 释放该存储空间时将撤消该对象。732 构造与析构函数使用示例1. 构造函数的初始化作用 #includeclass CPoint int x , y ;public:CPoint (int vx , int vy ); void offset(int ax ,int ay);void Print() coutclass Cylinderpublic:Cylinder( ) Cylinder(double r , double h);void setcyli

7、nder(double r ,double h);double gettradius( )return radius;double getheight( )return height;double volume( );double surface_area();private:double radius;double height ;const double PI=3.1415926;Cylinder :Cylinder(double r , double h) radius=r ; height=h ; void Cylinder:setCylinder(double r ,double h

8、) radius=r ; height=h ; double Cylinder :volume()double vol ;vol=PI*radius*radius*height ;return vol ;double Cylinder :surface_area()double area ;area=2*PI*radius*height+2*PI*radius*radius ;return area ;void main()Cylinder Cylinder(7.0 , 12.0) , Cylinder2 ; /ACylinder2.setcylinder(12.3 ,18.7) ;cout:

9、 () 此构造函数,并没有对对象种的成员数据做任何的初始化工作。调用默认的构造函数后,对象中的数据是不确定的,还必须采用其它方法对对象中的成员数据进行初始化。# includeclass CNum int i , j ;public :void SetDate(int x , int y)i=x , j=6 ;void Print( )coutclass CNum int i ,j ;public:CNum (int x ,int y) /A i= x ; j= y ;void main ()CNum number ; /B6此时,在类 CNum 中要增加一个无参数的构造函数:CNum:CNu

10、m() 4具有默认参数值的构造函数1)与调用具有默认参数值的普通函数一样,对具有默认参数的构造函数,在创建对象时可以不向它传递全部参数值。2)如果构造函数只有部分参数有默认值,则默认值的参数必须在参数表的右侧。3)同一个类中有多个具有默认参数值的构造函数时,容易产生二义性。因此,一个类中最好只有一个具有默认参数的构造函数。创建对象时,如果有超过一个构造函数的形参与对象的实参匹配,会产生二义性。例:# includeclass CNum int i , j ;public :CNum(int x ) i=x , j=0 CNum(int x , int y=2 )i =x ; j=y ;void

11、 Print ( ) coutclass CPoint int x , y , pixel ;public :CPoint ( ) x=0 , y=0, pixel=100 ; /第 1 个构造函数CPoint (int vx , int vy=0 ) ; /第 2 个构造函数CPoint ( int vx , int vy ,int pel=100 ) ; /第 3 个构造函数void Print ( ) cout class A private :int i ;public:A (int a) i=a ;coutclass CCircle private :int r ;public :C

12、Circle ( int a) r = a ; void Print ()coutPrint() ;delete c2 ; /A 撤消 c2 时,调用析造函数。cout#includeclass CStack /栈类9 int *top ; /栈顶指针,指向栈的顶,即最上面的数据的前一个字节int *bottom; /栈底指针,指向栈的底,即最下面的数据的前一个字节public :CStack() /构造函数,将栈底指针和栈顶指针同时指向一个 100 字节的内存空间 top=bottom=new int 100 ;void Push (int c) /入栈函数 if ( (top-bottom)=bottom ) /如果栈非空,则返回最上面的数据return *top ; CStack( ) /析构函数,由于 bottom 和 top 指向同一个存储域,故不需要 delete top delete bottom ; ;char *ReverseName(char*name) /字符串反序函数 CStack s ;char *reverse ;for (int i=0 ;istr ;cout”该字符串的反序为:”ReverseName(str) n ; 执行结果:输入一个字符串:此时若输入:123456则输出结果为:该字符串的反序为:654321

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号