41类文档格式.docx
- 文档编号:22517382
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:13
- 大小:19.74KB
41类文档格式.docx
《41类文档格式.docx》由会员分享,可在线阅读,更多相关《41类文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
如果我们在定义一个class成员的时候没有声明其允许范围,这些成员将被默认为private范围。
例如:
classCRectangle{
intx,y;
public:
voidset_values(int,int);
intarea(void);
}rect;
上面例子定义了一个classCRectangle和该class类型的对象变量rect。
这个class有4个成员:
两个整型变量(x和y),在private部分(因为private是默认的允许范围);
以及两个函数,在public部分:
set_values()和area(),这里只包含了函数的原型(prototype)。
注意class名称与对象(object)名称的不同:
在上面的例子中,CRectangle是class名称(即用户定义的类型名称),而rect是一个CRectangle类型的对象名称。
它们的区别就像下面例子中类型名int和变量名a的区别一样:
inta;
int是class名称(类型名),而a是对象名objectname(变量)。
在程序中,我们可以通过使用对象名后面加一点再加成员名称(同使用Cstructs一样),来引用对象rect的任何public成员,就像它们只是一般的函数或变量。
rect.set_value(3,4);
myarea=rect.area();
但我们不能够引用x或y,因为它们是该class的private成员,它们只能够在该class的其它成员中被引用。
晕了吗?
下面是关于classCRectangle的一个复杂的例子:
//classesexample
#include<
iostream.h>
intarea(void){return(x*y);
}
};
voidCRectangle:
:
set_values(inta,intb){
x=a;
y=b;
}
intmain(){
CRectanglerect;
rect.set_values(3,4);
cout<
<
"
area:
<
rect.area();
}
12
上面代码中新的东西是在定义函数set_values().使用的范围操作符(双冒号:
)。
它是用来在一个class之外定义该class的成员。
注意,我们在CRectangleclass内部已经定义了函数area()的具体操作,因为这个函数非常简单。
而对函数set_values(),在class内部只是定义了它的原型prototype,而其实现是在class之外定义的。
这种在class之外定义其成员的情况必须使用范围操作符:
范围操作符(:
)声明了被定义的成员所属的class名称,并赋予被定义成员适当的范围属性,这些范围属性与在class内部定义成员的属性是一样的。
例如,在上面的例子中,我们在函数set_values()中引用了private变量x和y,这些变量只有在class内部和它的成员中才是可见的。
在class内部直接定义完整的函数,和只定义函数的原型而把具体实现放在class外部的唯一区别在于,在第一种情况中,编译器(compiler)会自动将函数作为inline考虑,而在第二种情况下,函数只是一般的class成员函数。
我们把x和y定义为private成员(记住,如果没有特殊声明,所有class的成员均默认为private),原因是我们已经定义了一个设置这些变量值的函数(set_values()),这样一来,在程序的其它地方就没有办法直接访问它们。
也许在一个这样简单的例子中,你无法看到这样保护两个变量有什么意义,但在比较复杂的程序中,这是非常重要的,因为它使得变量不会被意外修改(这里意外指的是从object的角度来讲的意外)。
使用class的一个更大的好处是我们可以用它来定义多个不同对象(object)。
例如,接着上面classCRectangle的例子,除了对象rect之外,我们还可以定义对象rectb:
//classexample
CRectanglerect,rectb;
rectb.set_values(5,6);
rectarea:
rect.area()<
endl;
rectbarea:
rectb.area()<
12
30
注意:
调用函数rect.area()与调用rectb.area()所得到的结果是不一样的。
这是因为每一个classCRectangle的对象都拥有它自己的变量x和y,以及它自己的函数set_value()和area()。
这是基于对象(object)和面向对象编程(object-orientedprogramming)的概念的。
这个概念中,数据和函数是对象(object)的属性(properties),而不是像以前在结构化编程(structuredprogramming)中所认为的对象(object)是函数参数。
在本节及后面的小节中,我们将讨论面向对象编程的好处。
在这个具体的例子中,我们讨论的class(object的类型)是CRectangle,有两个实例(instance),或称对象(object):
rect和rectb,每一个有它自己的成员变量和成员函数。
构造函数和析构函数(Constructorsanddestructors)
对象(object)在生成过程中通常需要初始化变量或分配动态内存,以便我们能够操作,或防止在执行过程中返回意外结果。
例如,在前面的例子中,如果我们在调用函数set_values()之前就调用了函数area(),将会产生什么样的结果呢?
可能会是一个不确定的值,因为成员x和y还没有被赋于任何值。
为了避免这种情况发生,一个class可以包含一个特殊的函数:
构造函数constructor,它可以通过声明一个与class同名的函数来定义。
当且仅当要生成一个class的新的实例(instance)的时候,也就是当且仅当声明一个新的对象,或给该class的一个对象分配内存的时候,这个构造函数将自动被调用。
下面,我们将实现包含一个构造函数的CRectangle:
intwidth,height;
CRectangle(int,int);
intarea(void){return(width*height);
CRectangle:
CRectangle(inta,intb){
width=a;
height=b;
CRectanglerect(3,4);
CRectanglerectb(5,6);
}
正如你所看到的,这个例子的输出结果与前面一个没有区别。
在这个例子中,我们只是把函数set_values换成了class的构造函数constructor。
注意这里参数是如何在class实例(instance)生成的时候传递给构造函数的:
CRectanglerect(3,4);
CRectanglerectb(5,6);
同时你可以看到,构造函数的原型和实现中都没有返回值(returnvalue),也没有void类型声明。
构造函数必须这样写。
一个构造函数永远没有返回值,也不用声明void,就像我们在前面的例子中看到的。
析构函数Destructor完成相反的功能。
它在objects被从内存中释放的时候被自动调用。
释放可能是因为它存在的范围已经结束了(例如,如果object被定义为一个函数内的本地(local)对象变量,而该函数结束了);
或者是因为它是一个动态分配的对象,而被使用操作符delete释放了。
析构函数必须与class同名,加水波号tilde(~)前缀,必须无返回值。
析构函数特别适用于当一个对象被动态分别内存空间,而在对象被销毁的时我们希望释放它所占用的空间的时候。
//exampleonconstructorsanddestructors
int*width,*height;
~CRectangle();
intarea(void){return(*width**height);
width=newint;
height=newint;
*width=a;
*height=b;
~CRectangle(){
deletewidth;
deleteheight;
CRectanglerect(3,4),rectb(5,6);
return0;
构造函数重载(OverloadingConstructors)
像其它函数一样,一个构造函数也可以被多次重载(overload)为同样名字的函数,但有不同的参数类型和个数。
记住,编译器会调用与在调用时刻要求的参数类型和个数一样的那个函数(Section2.3,Functions-II)。
在这里则是调用与类对象被声明时一样的那个构造函数。
实际上,当我们定义一个class而没有明确定义构造函数的时候,编译器会自动假设两个重载的构造函数(默认构造函数"
defaultconstructor"
和复制构造函数"
copyconstructor"
)。
例如,对以下class:
classCExample{
inta,b,c;
voidmultiply(intn,intm){a=n;
b=m;
c=a*b;
没有定义构造函数,编译器自动假设它有以下constructor成员函数:
∙Emptyconstructor
它是一个没有任何参数的构造函数,被定义为nop(没有语句)。
它什么都不做。
CExample:
CExample(){};
∙Copyconstructor
它是一个只有一个参数的构造函数,该参数是这个class的一个对象,这个函数的功能是将被传入的对象(object)的所有非静态(non-static)成员变量的值都复制给自身这个object。
CExample:
CExample(constCExample&
rv){
a=rv.a;
b=rv.b;
c=rv.c;
必须注意:
这两个默认构造函数(emptyconstruction和copyconstructor)只有在没有其它构造函数被明确定义的情况下才存在。
如果任何其它有任意参数的构造函数被定义了,这两个构造函数就都不存在了。
在这种情况下,如果你想要有emptyconstruction和copyconstructor,就必需要自己定义它们。
当然,如果你也可以重载class的构造函数,定义有不同的参数或完全没有参数的构造函数,见如下例子:
//overloadingclassconstructors
ClassCRectangle{
CRectangle();
CRectangle(){
width=5;
height=5;
CRectanglerectb;
25
在上面的例子中,rectb被声明的时候没有参数,所以它被使用没有参数的构造函数进行初始化,也就是width和height都被赋值为5。
注意在我们声明一个新的object的时候,如果不想传入参数,则不需要写括号():
CRectanglerectb;
//right
CRectanglerectb();
//wrong!
类的指针(Pointerstoclasses)
类也是可以有指针的,要定义类的指针,我们只需要认识到,类一旦被定义就成为一种有效的数据类型,因此只需要用类的名字作为指针的名字就可以了。
CRectangle*prect;
是一个指向classCRectangle类型的对象的指针。
就像数据机构中的情况一样,要想直接引用一个由指针指向的对象(object)中的成员,需要使用操作符->
这里是一个例子,显示了几种可能出现的情况:
//pointertoclassesexample
voidset_values(int,int);
intarea(void){return(width*height);
CRectanglea,*b,*c;
CRectangle*d=newCRectangle[2];
b=newCRectangle;
c=&
a;
a.set_values(1,2);
b->
set_values(3,4);
d->
set_values(5,6);
d[1].set_values(7,8);
aarea:
a.area()<
*barea:
area()<
*carea:
c->
d[0]area:
d[0].area()<
d[1]area:
d[1].area()<
2
30
56
以下是怎样读前面例子中出现的一些指针和类操作符(*,&
.,->
[]):
∙*x读作:
pointedbyx(由x指向的)
∙&
x读作:
addressofx(x的地址)
∙x.y读作:
memberyofobjectx(对象x的成员y)
∙(*x).y读作:
memberyofobjectpointedbyx(由x指向的对象的成员y)
∙x->
y读作:
memberyofobjectpointedbyx(同上一个等价)
∙x[0]读作:
firstobjectpointedbyx(由x指向的第一个对象)
∙x[1]读作:
secondobjectpointedbyx(由x指向的第二个对象)
∙x[n]读作:
(n+1)thobjectpointedbyx(由x指向的第n+1个对象)
在继续向下阅读之前,一定要确定你明白所有这些的逻辑含义。
如果你还有疑问,再读一遍这一笑节,或者同时参考小节"
3.3,指针(Pointers)"
和"
3.5,数据结构(Structures)"
.
由关键字struct和union定义的类
类不仅可以用关键字class来定义,也可以用struct或union来定义。
因为在C++中类和数据结构的概念太相似了,所以这两个关键字struct和class的作用几乎是一样的(也就是说在C++中struct定义的类也可以有成员函数,而不仅仅有数据成员)。
两者定义的类的唯一区别在于由class定义的类所有成员的默认访问权限为private,而struct定义的类所有成员默认访问权限为public。
除此之外,两个关键字的作用是相同的。
union的概念与struct和class定义的类不同,因为union在同一时间只能存储一个数据成员。
但是由union定义的类也是可以有成员函数的。
union定义的类访问权限默认为public。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 41