C/C++基础 -- 类的定义与实现(1):什么是类

C/C++基础 -- 类的定义与实现(1)

  • 1、面向对象的程序设计
    • 1.1、C和C++程序设计思想的差异
    • 1.2、面向对象的程序设计的重要概念
  • 2、类
    • 2.1、类的定义
        • 2.1.1、类的定义
        • 2.1.2、类数据成员定义
        • 2.1.3、类成员函数定义
        • 2.1.4、类的作用域
        • 2.1.5、类的存储空间分配
    • 2.2、类的成员的访问控制
    • 2.3、类的成员的组织结构

本博文由 西北工业大学MOOC 总结而来,以备以后回顾。(侵删)

1、面向对象的程序设计

1.1、C和C++程序设计思想的差异

  首先我要对比一下C和C++在程序设计思想上的不同:
C语言 – 面向过程的程序设计思想
1)自定向下,逐步求精
2)一个main函数 + 若干个子函数
  C语言注重解决问题的过程,即将一个问题划分成若干个小问题(形成若干个子函数),通过解决小问题来最终解决整个问题。其缺点是编程效率低,代码可重用性差。
C++语言 – 面向对象的程序设计思想
1)将程序设计当作产业设计来实现
2)自然界是由各种实体(对象)组成的
  C++语言将世界所有的东西都分成一个个实体,而功能的实现是由一个个实体及其功能属性实现的。这样会提高效率。
  比如解决人吃饭的问题,C语言更注重于人吃饭的整个过程,即人是如何实现吃饭的功能的;而C++则会先去描述人这个对象,人具有若干属性和功能,吃饭只是人的一个行为功能罢了。当我需要继续描述 人能去解决的某些问题时,C语言要重新编写实现该过程的函数,人只是这个函数的一个参数;C++则只需要在人的描述中加入新的行为描述函数就可以,这样所描述的人的对象可以实现多种功能,用到人的相关功能时,我们只需要调用所定义对象的某个行为函数就可以实现功能,代码的重用性强。

1.2、面向对象的程序设计的重要概念

一、抽象:
  对具体对象(问题)进行概括,抽象出这一类对象的公共属性并加以描述的过程。分为数据抽象行为抽象
  比如我们定义汽车这个对象,或者解决长距离运输的问题会想到运用汽车这个对象。所有的汽车都是由轮子、发动机、变速箱等元素组成,通过对汽车这个对象进行进一步的划分成各个具有公共属性的组成元素,这个过程称为数据抽象。而所有的汽车都具有点火发动、前进后退、转向等行为功能,我们可以将汽车这个对象的行为,逐步划分为这些具有公共属性的单个行为,就可以描述整个汽车的所有行为,对行为的逐步划分的过程称为行为抽象
二、封装:
  封装就是将抽象出来的数据成员、行为成员相结合,将他们视为一个整体 —— 类。这样C++的重要组成部分——类的概念就产生了
  封装的好处是,我们在使用某个类的某个功能时,不需要了解其具体的实现细节,只需要通过接口使用类的成员集合即可。
  比如我们在使用汽车运输物品时,我们不需要了解汽车发动机发动点火,前进后退以及转弯的功能是如何实现的,我们只需要知道插入钥匙就可以实现点火、换挡踩油门就可以实现前进后退、转动方向盘就可以实现转弯就可以了。所以钥匙、挡位、油门、方向盘的转过角度就是实现一系列功能的接口。而功能的实现(相当于函数的实现),则是汽车设计者(类的设计者)所考虑的事情,并不是使用者考虑的事情。
三、继承和派生:
  继承和派生是指在保持原有类特性的基础上(称为继承),对某些特殊的对象进行更为具体的说明和描述(称为派生)。
  比如汽车也分为好多种类,比如轿车、货车和装卸车,他们具有公共的属性和行为(都是由轮子组成,都可以前进和后退)。在此基础上,我们将他们区分并加以细致描述,就在汽车的基础上形成了三个有公共属性但是在具体行为上有区别的新的对象(比如其长宽高的限制不同,所安装的配件不同,在功能上也有载客、运输货物、装卸物品的不同)。这三个新的对象,就是继承了汽车这个对象的公共属性,并在此基础上所派生出的新的对象。
  所以在程序设计中,可以分为两类程序猿,一类是设计类功能的程序猿,注重于类的组成和功能的具体实现过程;一类是使用类功能的程序猿,注重于使用别人定义好的类的接口,对不同接口进行组合去实现自己想要的功能。这就好比设计电脑生产电脑的人和使用电脑做软件开发的人的区别。

2、类

2.1、类的定义

2.1.1、类的定义

  类(class)是用户自定义的数据类型。如果程序中要使用类类型(class type)对象,就必须根据实际需要定义,或者使用已设计好的类。
  C++定义一个类,其方法于定义一个结构体类型是相似的,一般形式为:
C/C++基础 -- 类的定义与实现(1):什么是类_第1张图片
  一个类的定义有以下三个特点
1)每个类可以没有成员,也可以有多个成员;
2)类成员可以是数据,也可以是函数;
3)所有成员都必须在类的内部声明,一旦类定义完成后,就没有任何其他方式可以增加成员了。

2.1.2、类数据成员定义

  类定义是必须给出数据成员(data member)的数据类型声明,其一般形式为:
C/C++基础 -- 类的定义与实现(1):什么是类_第2张图片
  此外每个类还可以包含成员函数,在该类的定义中能够访问该类自身的所有成员。
  面向对象的程序设计一般将数据隐蔽起来,外部不能直接访问,而把成员函数作为外界的接口,通过成员函数访问数据。即数据成员是属性,成员函数是方法,通过方法存取属性

2.1.3、类成员函数定义

  如果类中有成员函数,则声明成员函数是必需的,定义成员函数是可选的,因此,类的成员函数有两种形式:
1)在类中(声明中)定义成员函数,形式如下:
C/C++基础 -- 类的定义与实现(1):什么是类_第3张图片
2)在类外定义成员函数,形式如下:
C/C++基础 -- 类的定义与实现(1):什么是类_第4张图片
例:成员函数的定义

class Data	//定义Data类
{
public//成员访问控制标识符,后面会讲到
	int data;//定义数据成员
	//定义成员函数
	void set(int d) {data = d;}	//成员函数类内定义
	int get();	//成员函数声明
}
//类外定义成员函数
void Data::set(int d)
{
	return data;
}
2.1.4、类的作用域

  类的作用域和其他变量一样,分为全局和局部。
  类定义一般放在程序的文件开头,或者放到头文件中被程序文件包含,此时类的作用域时全局的。在全局作用域内,该定义处处可见,因此同作用域内的所有函数都可以使用它。
  类定义也可以放在函数内部或者局部作用域中,此时类的定义是局部的。如果函数内部有同名的类定义,则全局声明在该函数内部是无效的,有效的是局部定义的类

  C++规定,在局部作用域中声明的类,成员函数必须是函数定义的形式,而不是原型声明的形式,即定义局部类就要在局部作用域内定义类的所有内容。但是一般类是为整个程序服务的,因此很少有将类放到局部作用域中去

2.1.5、类的存储空间分配

  类定义向编译器定义了一种新的数据类型,该数据类型有不同类型的数据成员和成员函数。尽管数据成员类似变量的定义,但由于类声明时并不会产生该成员的实体,即系统不会为实体数据成员为空的类分配空间。系统只会对具有实体对象的类分配空间

2.2、类的成员的访问控制

  对类成员的访问,来自两个访问源:类成员类用户
  类成员指类本身的成员类用户指类外部的使用者,包括全局函数,另一个类的成员函数等。
  无论数据成员还是函数成员,类的每个成员都有访问控制属性,有以下三种访问标号说明:public(公有的)、private(私有的)、protected(保护的)
  一、共有成员public:
  公有成员用public标号声明,类成员和类用户都可以访问公有成员,但是来自类外部的类用户必须通过公有成员来访问。显然,public实现了类的外部接口
  二、私有成员private:
  私有成员用private标号声明,只有类成员可以访问私有成员,类用户不允许访问私有成员。显然,private实现了私有成员的隐蔽
  三、保护成员protected:
  保护成员用protected标号声明,在不考虑继承的情况下,protected的性质和private性质一样,但是保护成员可以被派生类成员访问,而私有成员不能被派生类成员访问。

  成员访问控制时C++的类和结构体的又一个重要特性,加上访问标识符,类定义的一般形式为:
C/C++基础 -- 类的定义与实现(1):什么是类_第5张图片
  如果没有声明访问控制属性,类所有成员默认为private,即私有的。(结构体默认为public)
例如:
C/C++基础 -- 类的定义与实现(1):什么是类_第6张图片

2.3、类的成员的组织结构

  在定义类时,我们进行如下说明:

  1. 在定义类时,声明为public、private或protected的成员的次序任意。
  2. 在一个类中不一定都包含public、private、protected标识符,可以只有public、private、protect中的某几个或任意组合。
  3. 关键自public、private、protected可以分为分别多次出现,即一个类体可以包含多个public、private、protected部分。但是更通用的做法时将相同访问控制属性的成员集中在一起写
  4. 实际编程中,为了使程序清晰,每一种成员访问限定符在类体中只出现一次,且按照public、protected、private顺序组织,形成访问权限层次分明的结构。

你可能感兴趣的:(C/C++,C/C++,类的定义)