C++类的声明和对象的定义
时间:2014-10-24 22:27 点击:次
每一个实体都是对象。有一些对象是具有相同的结构和特性的。每个对象都属于一个特定的类型,这个特定的类型称为类(class )。
类代表了某一批对象的共性和特征。前面已说明:类是对象的模板,而对象是类的具体实例(instance)。
正如同结构体类型和结构体变量的关系一样,需要先声明一个结构体类型,然后用它去定义结构体变量。同一个结构体类型可以定义出多个不同的结构体变量。
在C++中也是先声明一个类类型,然后用它去定义若干个同类型的对象。对象就是类类型的一个变量。可以说类是对象的模板,是用来定义对象的一种抽象类型。
类是抽象的,不占用内存,而对象是具体的,占用存储空间。
在C++中声明一个类类型和声明一个结构体类型是相似的。下面是声明一个结构体类型的方法:
现在声明一个类:
可以看到声明类的方法是由声明结构体类型的方法发展而来的。第1行“class Student" 是类头(class head),由关键字class与类名Student组成,class是声明类时必须使用的关键字,相当于声明结构体类型时必须用struct —样。从第2行开头的左花括号起到倒数第2行的右花括号是类体(class body)。也就是说,类体是用一对花括号包起来的。类的声明以分号结束。
在类体中是类的成员列表(class member list),列出类中的全部成员。可以看到除了 数据部分以外,还包括了对这些数据操作的函数。这就体现了把数据和操作封装在一起。 display是一个函数,对本对象中的数据进行操作,其作用是输出本对象中学生的学号、姓 名和性别。
可以看到,类(class )就是对象的类型。实际上,类是一种广义的数据类型。类这种数据类型中的数据既包含数据,也包含操作数据的函数。
现在封装在类对象stud1和stud2中的成员都对外界隐蔽,外界不能调用它们。只有本对象中的函数display可以引用同一对象中的数据。也就是说,在类外不能直接调用类 中的成员。这当然“安全"了,但是在程序中怎样才能执行对象studl的display函数呢?它无法启动,因为缺少对外界的接口,外界不能调用类中的成员函数,完全与外界隔绝了。 这样的类有什么用处呢?显然是毫无实际作用的。因此,不能把类中的全部成员与外界 隔离,一般是把数据隐蔽起来,而把成员函数作为对外界的接口。例如,可以从外界发出 —个命令,通知对象stud1执行其中的display函数,输出某一学生的有关数据。
可以将上面类的声明改为:
如果在类的定义中既不指定private,也不指定public,则系统就默认为是私有的。
归纳以上对类类型的声明,可得到其一般形式如下:
class 类名
{
private :
私有的数据和成员函数;
public :
公用的数据和成员函数;
};
private和public称为成员访问限定符(member access specifier)。除了private和public之外,还有一种成员访问限定符protected(受保护的),用protected声明的成员称为受保护的成员,它不能被类外访问(这点与私有成员类似),但可以被派生类的成员函数访问。
在声明类类型时,声明为private的成员和声明为public的成员的次序任意,既可以先出现private部分,也可以先出现public部分。如果在类体中既不写关键字private,又不写public,就默认为private。
在一个类体中,关键字private和public可以分别出现多次。每个部分的有效范围到出现另一个访问限定符或类体结束时(最后一个右花括号)为止。但是为了使程序清晰,应该养成这样的习惯,使每一种成员访问限定符在类定义体中只出现一次。
在以前的C++程序中,常先出现private部分,后出现public部分,如上面所示。现在的C++ 程序多数先写public部分,把private部分放在类体的后部。这样可以使用户将注意力集中在能被外界调用的成员上,使阅读者的思路更清晰一些。
在C++程序中,经常可以看到类。为了用户方便,常用的C++编译系统往往向用户提供类库(但不属于C++语言的组成部分),内装常用的基本的类,供用户使用。不少用户也把自己或本单位经常用到的类放在一个专门的类库中,需要用时直接调用,这样就减少了程序设计的工作量。
定义对象也可以有以下几种方法。
1) 先声明类类型,然后再定义对象
前面用的就是这种方法,如
Student stud1, stud2; //Student是已经声明的类类型在C++中,声明了类类型后,定义对象有两种形式。
应该说明,在C++中,在声明了类类型以后,定义对象有两种形式。
①class 类名 对象名
如 class Student stud1,stud2;
把class和Student合起来作为一个类名,用来定义对象。
②类名 对象名
如 Student stud1,stud2;
直接用类名定义对象。
这两种方法是等效的。第1种方法是从C语言继承下来的,第2种方法是C++的特色,显然第2种方法更为简捷方便。
2) 在声明类类型的同时定义对象
在定义Student类的同时,定义了两个Student 类的对象。
3) 不出现类名,直接定义对象
class //无类名
{
private : //声明以下部分为私有的
┆
public : //声明以下部分为公用的
┆
}stud1, stud2;//定义了两个无类名的类对象
直接定义对象,在C++中是合法的、允许的,但却很少用,也不提倡用。在实际的程序开发中,一般都采用上面3种方法中的第1种方法。在小型程序中或所声明的类只用于本程序时,也可以用第2种方法。在定义一个对象时,编译系统会为这个对象分配存储空间,以存放对象中的成员。
为了使结构体类型也具有封装的特征,C++不是简单地继承C的结构体,而是使它也具有类的特点,以便于用于面向对象程序设计。用struct声明的结构体类型实际上也就是类。用struct声明的类,如果对其成员不作private或public的声明,系统将其默认为public。
如果想分别指定私有成员和公用成员,则应用private或public作显式声明。
而用class定义的类,如果不作private或public声明,系统将其成员默认为private,在需要时也可以自己用显式声明改变。如果希望成员是公用的,使用struct比较方便,如果希望部分成员是私有的,宜用class。建议尽量使用class来建立类,写出完全体现C++风格的程序。
类代表了某一批对象的共性和特征。前面已说明:类是对象的模板,而对象是类的具体实例(instance)。
正如同结构体类型和结构体变量的关系一样,需要先声明一个结构体类型,然后用它去定义结构体变量。同一个结构体类型可以定义出多个不同的结构体变量。
在C++中也是先声明一个类类型,然后用它去定义若干个同类型的对象。对象就是类类型的一个变量。可以说类是对象的模板,是用来定义对象的一种抽象类型。
类是抽象的,不占用内存,而对象是具体的,占用存储空间。
类的声明
类是用户自己指定的类型。如果程序中要用到类类型,必须自己根据需要进行声明,或者使用别人已设计好的类。C++标准本身并不提供现成的类的名称、结构和内容。在C++中声明一个类类型和声明一个结构体类型是相似的。下面是声明一个结构体类型的方法:
- struct Student //声明了一个名为Student的结构体类型
- {
- int num;
- char name[20];
- char sex;
- };
- Student stud1, stud2; //定义了两个结构体变量stud1和stud2,它只包括数据,没有包括操作
struct Student //声明了一个名为Student的结构体类型 { int num; char name[20]; char sex; }; Student stud1, stud2; //定义了两个结构体变量stud1和stud2,它只包括数据,没有包括操作
- class Student //以class开头
- {
- int num;
- char name[20];
- char sex; //以上3行是数据成员
- void display( ) //这是成员函数
- {
- cout<<"num:"<<num<<endl;
- cout<<"name:"<<name<<endl;
- cout<<"sex:"<<sex<<endl;
- //以上4行是函数中的操作语句}
- }
- };
- Student stud1,stud2; //定义了两个Student 类的对象stud1和stud2
class Student //以class开头 { int num; char name[20]; char sex; //以上3行是数据成员 void display( ) //这是成员函数 { cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl; //以上4行是函数中的操作语句} } }; Student stud1,stud2; //定义了两个Student 类的对象stud1和stud2
在类体中是类的成员列表(class member list),列出类中的全部成员。可以看到除了 数据部分以外,还包括了对这些数据操作的函数。这就体现了把数据和操作封装在一起。 display是一个函数,对本对象中的数据进行操作,其作用是输出本对象中学生的学号、姓 名和性别。
可以看到,类(class )就是对象的类型。实际上,类是一种广义的数据类型。类这种数据类型中的数据既包含数据,也包含操作数据的函数。
现在封装在类对象stud1和stud2中的成员都对外界隐蔽,外界不能调用它们。只有本对象中的函数display可以引用同一对象中的数据。也就是说,在类外不能直接调用类 中的成员。这当然“安全"了,但是在程序中怎样才能执行对象studl的display函数呢?它无法启动,因为缺少对外界的接口,外界不能调用类中的成员函数,完全与外界隔绝了。 这样的类有什么用处呢?显然是毫无实际作用的。因此,不能把类中的全部成员与外界 隔离,一般是把数据隐蔽起来,而把成员函数作为对外界的接口。例如,可以从外界发出 —个命令,通知对象stud1执行其中的display函数,输出某一学生的有关数据。
可以将上面类的声明改为:
- class Student //声明类类型
- {
- private : //声明以下部分为私有的
- int num;
- char name[20];
- char sex;
- public : //声明以下部分为公用的
- void display( )
- {
- cout<<"num:"<<num<<endl;
- cout<<"name:"<<name<<endl;
- cout<<"sex:"<<sex<<endl;
- }
- };
- Student stud1,stud2; //定义了两个Student类的对象
class Student //声明类类型 { private : //声明以下部分为私有的 int num; char name[20]; char sex; public : //声明以下部分为公用的 void display( ) { cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl; } }; Student stud1,stud2; //定义了两个Student类的对象
归纳以上对类类型的声明,可得到其一般形式如下:
class 类名
{
private :
私有的数据和成员函数;
public :
公用的数据和成员函数;
};
private和public称为成员访问限定符(member access specifier)。除了private和public之外,还有一种成员访问限定符protected(受保护的),用protected声明的成员称为受保护的成员,它不能被类外访问(这点与私有成员类似),但可以被派生类的成员函数访问。
在声明类类型时,声明为private的成员和声明为public的成员的次序任意,既可以先出现private部分,也可以先出现public部分。如果在类体中既不写关键字private,又不写public,就默认为private。
在一个类体中,关键字private和public可以分别出现多次。每个部分的有效范围到出现另一个访问限定符或类体结束时(最后一个右花括号)为止。但是为了使程序清晰,应该养成这样的习惯,使每一种成员访问限定符在类定义体中只出现一次。
在以前的C++程序中,常先出现private部分,后出现public部分,如上面所示。现在的C++ 程序多数先写public部分,把private部分放在类体的后部。这样可以使用户将注意力集中在能被外界调用的成员上,使阅读者的思路更清晰一些。
在C++程序中,经常可以看到类。为了用户方便,常用的C++编译系统往往向用户提供类库(但不属于C++语言的组成部分),内装常用的基本的类,供用户使用。不少用户也把自己或本单位经常用到的类放在一个专门的类库中,需要用时直接调用,这样就减少了程序设计的工作量。
对象的定义
上面的程序中,最后一行用已声明的Student类来定义对象,这种方法是很容易理解的。经过定义后,stud1和stud2就成为具有Student类特征的对象。stud1和stud2这两个对象都分别包括Student类中定义的数据和函数。定义对象也可以有以下几种方法。
1) 先声明类类型,然后再定义对象
前面用的就是这种方法,如
Student stud1, stud2; //Student是已经声明的类类型在C++中,声明了类类型后,定义对象有两种形式。
应该说明,在C++中,在声明了类类型以后,定义对象有两种形式。
①class 类名 对象名
如 class Student stud1,stud2;
把class和Student合起来作为一个类名,用来定义对象。
②类名 对象名
如 Student stud1,stud2;
直接用类名定义对象。
这两种方法是等效的。第1种方法是从C语言继承下来的,第2种方法是C++的特色,显然第2种方法更为简捷方便。
2) 在声明类类型的同时定义对象
- class Student//声明类类型
- {
- public ://先声明公用部分
- void display( )
- {
- cout<<"num:"<<num<<endl;
- cout<<"name:"<<name<<endl;
- cout<<"sex:"<<sex<<endl;
- }
- private ://后声明私有部分
- int num;
- char name[20];
- char sex;
- }stud1,stud2;//定义了两个Student类的对象
class Student//声明类类型 { public ://先声明公用部分 void display( ) { cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl; } private ://后声明私有部分 int num; char name[20]; char sex; }stud1,stud2;//定义了两个Student类的对象
3) 不出现类名,直接定义对象
class //无类名
{
private : //声明以下部分为私有的
┆
public : //声明以下部分为公用的
┆
}stud1, stud2;//定义了两个无类名的类对象
直接定义对象,在C++中是合法的、允许的,但却很少用,也不提倡用。在实际的程序开发中,一般都采用上面3种方法中的第1种方法。在小型程序中或所声明的类只用于本程序时,也可以用第2种方法。在定义一个对象时,编译系统会为这个对象分配存储空间,以存放对象中的成员。
类和结构体类型的异同
C++增加了class类型后,仍保留了结构体类型(struct ),而且把它的功能也扩展了。C++允许用struct来定义一个类型。如可以将前面用关键字class声明的类类型改为用关键字struct:- struct Student //用关键字struct来声明一个类类型
- {
- private : //声明以下部分为私有的
- int num;//以下3行为数据成员
- char name[20];char sex;
- public: //声明以下部分为公用的
- void display( ) //成员函数
- {
- cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl;
- }
- };
- Student stud1, stud2;//定义了两个Student类的对象
struct Student //用关键字struct来声明一个类类型 { private : //声明以下部分为私有的 int num;//以下3行为数据成员 char name[20];char sex; public: //声明以下部分为公用的 void display( ) //成员函数 { cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl; } }; Student stud1, stud2;//定义了两个Student类的对象
为了使结构体类型也具有封装的特征,C++不是简单地继承C的结构体,而是使它也具有类的特点,以便于用于面向对象程序设计。用struct声明的结构体类型实际上也就是类。用struct声明的类,如果对其成员不作private或public的声明,系统将其默认为public。
如果想分别指定私有成员和公用成员,则应用private或public作显式声明。
而用class定义的类,如果不作private或public声明,系统将其成员默认为private,在需要时也可以自己用显式声明改变。如果希望成员是公用的,使用struct比较方便,如果希望部分成员是私有的,宜用class。建议尽量使用class来建立类,写出完全体现C++风格的程序。
顶一下
(10)
100%
踩一下
(0)
0%
上一篇:C++面向对象的程序设计
下一篇:C++类的成员函数
相关内容:
最新内容
热点内容
- QQ群
-
微信
- 返回首页
- 返回顶部