写在最前面呀~~~
这个专栏是作者在自学C++过程中的一些笔记,包括了学习资料中课件知识和自己的一些总结。
关于学习资料,是中国大学MOOC上,北京大学的《程序设计与算法(三)C++面向对象程序设计》,主讲老师郭炜帅气又潇洒,推荐大家去看看
1. 程序设计的分类
关于程序设计,分为两类,面向对象的程序设计与结构化程序设计。
直接来说,在结构化程序设计中,程序=数据结构+算法。
程序由全局变量以及众多相互调用的函数组成,各个函数之间可以互相调用,各个函数也可以使用各个(全局)变量,如下图所示。
这种编程方法,在程序较为短小时还好,当工程规模愈发庞大,就会变得难以理解,错综复杂的关系也会使得程序扩充与重用性差、难以查错、没有“封装”和“隐藏”的概念;
在面向对象的程序设计中,程序=类+类+…类,换言之,设计程序的过程,其实就是设计各个类的过程。
关于面向对象的程序设计方法,类是什么呢?换个问题,类的组成是什么呢?
分两部分,数据结构和函数:
(1)我们可以用多个变量描述一个事物的属性,于是将客观事物或问题的共同属性归纳出来,可以形成一个数据结构
(2)将这一类事物或者问题的行为归纳出来,形成可以操作(1)中数据结构的函数(即抽象)
类就是通过特定的语法形式,将上述数据结构与函数捆绑在一起而形成的。也说我们“封装”这些数据结构与算法形成了一个类。
2. 面向对象程序设计的特点
抽象
封装
继承
多态
3. C++中的“类”
编写实例
//C++中类的编写和使用实例:计算长方形面积和体积
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;
}
关于类的用法
(1)用法1:对象名.成员名
CRectangle r1, r2;
r1.w = 5;
r2.Init(5, 4);
(2)指针->成员名
CRectangle r1, r2;
CRectangle * p1 = & r1;
CRectangle * p2 = & r2;
p1->w =5;
p2->Init(5,4);//Init作用在p2指向的对象上,即r2的地址
(3)引用名.成员名
CRectangle r2;
CRectangle & rr = r2;
rr.w = 5;
rr.Init(5,4)//通过引用的值改变对象的值
类成员的可访问范围
在类的定义过程中,常常使用不同的访问范围关键字来说明类成员可被访问的范围。
(1)private: 私有成员,只能在成员函数内访问
(2)public:公有成员,可以在任何地方访问
(3)protected:保护成员,之后会提及
换言之,在类的成员函数的内部,能够访问当前对象的全部属性与函数,以及同类的其他对象的全部属性与函数;在类的成员函数之外的地方,只能够访问该类对象的公有成员。
每个关键字出现的次数与次序均没有限制,如果某个成员前缺少访问范围关键字,则缺省地认为是私有成员,例如:
class Man{
int nAge; //默认为私有成员
char szName[20]; //默认为私有成员
public :
void SetName(char * szName){
strcpy(Man::szName, szName);
}
};
关于类内函数的定义,可以在类定义时仅仅对函数头进行声明,而不对函数体进行定义,而是在类外进行补充定义,例如:
class CEmployee{
private:
char szName[30];// name
public :
int salary;
void setName(char * name); //仅进行声明而不定义
void getNme(char * name);
void averageSalary(CEmployee e1, CEmployee e2);
};
// 进行类内成员函数的定义
void CEmployee::setName(char * name){
strcpy(szName, name);
}
void CEmployee::getName( char * name){
strcpy(name,szName);
}
void CEmployee::averageSalary(CEmployee e1,CEmployee e2){
cout << e1.szName;
salary = (e1.salary + e2.salary) / 2;
}
对于设置私有成员的机制,即”隐藏“的目的:强制对某些成员变量的访问一定要通过成员函数进行,则之后对成员变量的属性做出修改时,只需要修改成员函数即可,而不是修改所有直接访问到成员变量的语句。
类内成员函数的重载与参数缺省
成员函数可以进行重载与参数缺省,只要能够避免函数重载时出现二义性即可。