类的声明和对象的定义
Posted LC编程开发者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类的声明和对象的定义相关的知识,希望对你有一定的参考价值。
1类的声明和对象的定义
1.1 类和对象的关系
自然界中的每一个实体(物体)都可以作为对象。有一些对象是具有相同的结构和特性的。例如狮子,老虎,花猫是3个不同的对象,但是,它们是属于同一类型的,都是属于猫科动物,它们具有完全相同的结构和特性。藏獒,牧羊犬,哈士奇这3个对象的类型也是相同的,属于犬科动物,但它们与猫科动物的类型并不相同。每个对象都是属于一个特定的类型。
在C++中对象的类型称为类(class),类代表了某一批对象的共性和特征。类是对象的抽象,而对象是类的具体实例(instance)。正如同C语言的struct结构体类型和结构体变量的关系一样。
在C语言中我们先声明一个struct结构体类型,然后,用它去定义结构体变量。同一个结构体类型可以定义出多个不同的结构体变量。同理,在C++中也是先声明一个类类型,然后,用它去定义若干个同类型的对象。对象就是类类型的一个变量。
所以,C++的类是一种数据类型,如同C语言的struct结构体类型一样,不占用内存。而对象是类定义的一个变量,如同C语言定义的struct结构体类型变量一样,占用存储空间。
1.2 声明C++类
C++使用class关键字来声明一个类。例如,一个班级中有男同学和女同学,他们都是属于“学生”这个类。
所以,我们可以定义一个学生类,用来描述一个学生的信息。然后,就可以使用这个学生类来定义一个学生对象。
那么,在C++中怎么样声明一个类类型呢?其方法和声明一个结构体类型是相似的。下面我们先来看看C语言定义一个结构体类型的方法:
struct student //声明一个名为student 的结构体类型
{
char name[32]; //姓名
char addr[32]; //家庭地址
long long number; //电话号码
};
struct student stud1, stud2; //定义了两个结构体变量stud1 和stud2
上面声明了一个名为student的结构体类型并定义了两个结构体变量stud1和stud2,可以看到它只包括数据(变量),没有包括操作,现在,声明一个类:
class student //以class 开头
{
char name[32]; //姓名
char addr[32]; //家庭地址
long long number; //电话号码
void print() //输出成员的信息
{
cout << "name = " << name << endl;
cout << "addr = " << addr << endl;
cout << "number = " << number << endl;
}
};
student stud1, stud2; //定义了两个student类的对象stud1和stud2
可以看到,声明类的方法是由声明结构体类型的方法发展而来的。第一行“class student”是类头(class head),由关键字class与类名student组成,class是声明类时必须使用的关键字,相当于声明结构体类型时,必须使用struct一样。从第二行开头的左花括号起,到倒数第二行的右花括号是类体(class body)。也就是说,类体是一对花括号包起来的。类的声明以分号结束。
在类体中是类的成员列表(class member list),列出类中的全部成员。可以看到除了数据部分以外,还包括了对这些数据操作的函数。这就体现了把“数据和操作封装在一起”。print()是一个函数,用来对本对象中的数据进行操作。
可以看到,类(class)就是对象的类型。实际上,类也是一种数据类型,它包含属性和行为(函数)。
现在封装在类对象stud1和stud2中的成员对外界都是隐藏的,外界不能调用它们。只有本地对象中的函数 print() 可以引用同一个对象中的数据。也就是说,在类外不能直接调用类中的成员。那么,我们想调用stud1对象的print()函数,要怎么样操作?
可以将上面的类声明改为:
class student //以class 开头
{
private:
//定义成员变量
char name[32]; //姓名
char addr[32]; //家庭地址
long long number; //电话号码
public:
//定义成员函数
void print() //输出成员的信息
{
cout << "name = " << name << endl;
cout << "addr = " << addr << endl;
cout << "number = " << number << endl;
}
};
student stud1, stud2; //定义了两个student类的对象stud1和stud2
现在,声明了 print() 函数是公用的,外界就可以调用该函数了。
如果在类中既不定义 private,也不指定 public,那么,系统就默认是私有(private)的(第一次的类声明就属于这种情况)。
归纳以上对类类型的声明,可以得到其一般形式如下:
class 类名
{
private:
私有的数据和成员函数
public:
公用的数据和成员函数
};
private和public称为“成员访问限定符(member access specifier)”。用它们来声明各成员的访问属性。被声明为私有的(private)成员,只能被本类中的成员函数引用,类外不能调用(友元类例外,在后续章节介绍友元的知识),被声明为公用的(public)成员,即可以被本类中的成员函数所引用,也可以被类的作用域内的其他函数引用。
类的public成员变量和成员函数,可以在类外访问。
除了private和public之外,还有一种成员访问限定符 protected(受保护的),用protected声明的成员称为受保护的成员,它不能被类外访问(这点与私有成员类似),但,可以被派生类的成员函数访问,有关派生类的知识将在第四章介绍。
在声明类类型时,声明为private的成员和声明为public的成员的次序任意。即可以先出现private部分,也可以先出现public部分。在一个类体中不一定都包含private和public部分,可以只有private部分或只有public部分。在一个类体中,关键字private和public可以分别出现多次,即一个类体可以包含多个private和public部分。每个部分的有效范围到出现另一个访问限定符或类体结束时(最后一个右花括号)为止。但是,为了使程序清晰,应该养成这样的习惯:使每一种成员访问限定符在类定义体中只出现一次。
韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip
以上是关于类的声明和对象的定义的主要内容,如果未能解决你的问题,请参考以下文章