结构化程序设计
C语言使用结构化程序设计:程序=数据结构+算法。程序由全局变量以及多个相互调用的函数组成,算法以函数的形式实现,用于对数据结构进行操作。
结构化程序设计有许多不足,主要包括:
1.结构化程序设计中,函数和其操作的数据结构,没有直观的联系。
2.随着程序规模的增加,程序变得难以理解:比如很难看出某个数据结构到底有哪些函数可以对其进行操作,任意两个函数之间到底存在怎样的调用关系。
3.结构化程序设计没有封装和隐藏的概念。要访问某个数据结构的某个变量,就可以直接访问,那么当该变量的定义有改动的时候,就要把所有访问该变量的语句找出来修改,十分不利于程序的维护和扩充。
4.同时也难以查错,当某个数据结构的值不正确时,难以找到是哪个函数导致的。
5.重用:在编写某个程序时,发现其需要的某项功能,在现有的某个程序里已经有了相同或类似的实现,那么自然希望能够将那部分代码抽取出来,在新程序中使用。
5.总之,结构化程序,在规模庞大的时.会变得难以理解,难以扩充,难以查错,难以重用。
面向对象程序设计
上述问题可以通过面向对象的程序设计解决。面向对象程序设计=类+类+…..+类。设计程序的过程,就是设计类的过程。
面向对象的程序设计方法:
1.将某类客观事物共同特点(属性)归纳出来,形成一个数据结构(可以多个变量描述事物的属性);
2.将这类事物所能进行的行为也归纳出来,形成一个个函数,这些函数可以用来操作数据结构(这一步叫“抽象”)。
然后,通过某种语法形式,将数据结构和操作该数据结构的函数捆绑在一起,形成一个“类”,从而使得数据结构的算法呈现出显而易见的紧密关系,这就是封装。面向对象程序设计具有抽象、封装、继承、多态四个基本特点。
类和对象
从客观事物抽象出类
例:写一个程序,输入矩形的长和宽,输出面积和周长。
这里就可以将长宽变量和设置长宽,求面积,求周长的三个函数封装在一起,就能形成一个矩形类。
长宽变量成为该矩形类的成员变量,三个函数称为该类的成员函数。成员变量和成员函数统称为类的成员。实际上,类看上去就像带函数的结构。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using namespace std;
class CRectangle{
public:
int w,h;
int Area(){
return w*h;
}
int Perimeter(){
return 2*(w+h);
}
void Init(int w_,int h_){
w = w_;
h = h_;
}
};//必须有分号
int main()
{
int w,h;
CRectangle r;//r是一个对象
cin >> w >> h;
r.Init(w,h);
cout << r.Area() << endl << r.Perimeter();
return 0;
}
通过类,就可以定义变量。类定义出来的变量,也称为类的实例,也就是所谓的对象。C++中,类的名字就是用户自定义的类型的名字。可以像使用基本类型那样来使用它。CRectangle就是一种用户自定义的类型。
对象的内存分配
和结构对象一样,对象所占用的内存空间大小,等于所有成员变量的大小之和。对于上述的CRectangle类,sizeof(CRectangle)=8。每个对象各有自己的存储空间,一个对象或某个成员变量被改变了,不会影响到另一个对象。
和结构变量一样,对象之间可以用“=”进行赋值,但是不能用“==”,“ !=”,“ >”,“ <”,“ >=”,进行比较,除非这些运算符经过了重载。
用法1:对象名.成员名1
2
3CRectangle r1,r2;
r1.w = 5;
r2.Init(5,4);
Init作用在r2上,即Init函数执行期间访问的w和h是属于r2这个对象的,执行r2.Init不会影响到r1。
用法2. 指针->成员名1
2
3
4
5CRectangle r1,r2;
CRectangle *p1 = & r1;
CRectangle *p2 = & r2;
p1->w = 5;
p2->Init(5,4); //Init作用在p2指向的对象上
用法3. 引用名.成员名1
2
3
4
5
6
7
8
9
10
11CRectangle r2;
CRectangle & rr = r2;
rr.w = 5;
rr.Init(5,4); //rr的值变了,r2的值也变
void PrintRectangle(CRectangle & r){
cout << r.Area() << "," << r.Perimeter();
}
CRectangle r3;
r3.Init(5,4);
PrintRectangle(r3);