参考书目:《C++面向对象程序设计》—— 谭浩强 《C++程序设计:思想与方法》—— 翁惠玉
面向对象的程序设计的思路与人们日常生活中处理问题的思路相似。即,一个复杂的事物总是由许多部分组成的。当人们生产汽车时,不是先设计和制造发动机,再设计和制造底盘,然后设计和制造车身和车轮,而是分别设计和制造发动机、底盘、车身和车轮,最后把它们组装起来,这就是面向对象的基本思路。
面向对象的程序设计要素:
面向对象与面向过程的区别:
面向过程的程序设计方法 VS 面向对象的程序设计方法
面向对象程序设计包括两个方面:
①设计所需的各种类,即决定把哪些数据和操作封装在一起。
②考虑怎样向对象发送消息(调用对象的成员函数),实现所需的操作。这时设计程序象一个总调度,不断地向各个对象发送消息(命令),让这些对象活动起来(激活这些对象),完成各自的职责范围工作。
注:类是C++中十分重要的概念,它是实现面向对象程序设计的基础。类是所有面向对象的语言的共同特征,所有面向对象的语言都提供了这种类型。一个有一定规模的C++程序是由许多类构成的。C++支持面向过程的程序设计,也支持基于对象和面向对象的程序设计。基于对象就是基于类,基于对象的程序是以类和对象为基础的,程序的操作是围绕对象进行的。在此基础上利用继承机制和多态性,就成为面向对象的程序设计。把一组数据和相关的操作放在一起,这就是面向对象程序设计中的对象。
在面向对象程序设计中,要使用大量的对象,要程序员对问题进行分析抽象出类的概念,在设计程序时首先要声明类类型,然后再定义类类型变量即对象。
类代表了某一批对象的共性和特征。对象是类类型的一个变量。类是抽象的,不占用内存空间。对象是具体的,要占用内存空间。
类是要用户自己定义的类型,如果程序里要用类类型,程序员必须自己根据需要声明,也可以使用别人已设计好的类。声明一个类类型与声明一个结构体类型相似。
结构体声明:
struct student
{
int num;
char name[20];
char sex;
};
student st1,st2;
类声明:
class student
{
int num;
string name;
char sex;
void setdata()
{ cin >> num;
cin >> name;
cin >> sex;
}
void display()
{ cout<< num<<endl;
cout<< name<<endl;
cout<< sex <<endl;
}
};
student st1,st2;
C++类定义的格式
类的访问属性有:public,private以及protected.
访问控制 | 属 性 |
---|---|
public(公有成员) | 类的外部接口,可以被本类的成员函数访问,也能在类的作用域范围内的其他函数访问。 |
private(私有成员) | 仅允许本类成员函数访问,类外(除友元外)不能访问。 |
protected(保护成员) | 仅允许本类成员函数及派生类成员函数访问。 |
注:在定义类时,这三类成员不分前后顺序,也可以重复出现。一般推荐最多出现一次。
用class声明的类如果不带成员访问限定符,所有成员默认限定为private;
用struct声明的类如果不带成员访问限定符,所有成员默认限定为public。
在声明类时,必须定义访问类数据成员的函数,称之类的成员函数。
class student
{
int num;
string name;
char sex;
public:
void setdata();
void display();
};
void student :: setdata()
{ cin >> num;
cin >> name;
cin >> sex;
}
void student :: display()
{ cout<< num<<endl;
cout<< name<<endl;
cout<< sex <<endl;
}
student st1,st2;
注:(1)在类外定义成员函数时,必须在函数中增加类名,用于限定它属于哪个类,::是作用域限定符或称作用域运算符。上面的例子中如果函数不用成员访问限定符,函数就成了全局作用域中的display函数而不是成员函数。(2)如果在::前不带类名,或函数名前既无类名又无作用域运算符::,表示该函数是全局函数。(3)类的实现内容通常较大,为了便于阅读、管理和维护,最好将一个类拆分成一个.cpp文件和一个.h文件。
class student
{
int num;
string name;
char sex;
public:
inline void setdata()
inline void display()
};
定义了对象后,在程序中可以直接访问对象中的公有成员,它们可以是数据成员,也可以是成员函数。在程序中访问对象成员有三种方法:
注:只有成员函数可以访问类中的所有成员,而在类外只能访问公有成员。
class Time
{
public:
int hour;
int minute;
};
Time t, *p;
p= &t;
cout<< p->hour<<endl;
注·:p->hour表示p当前指向对象t中的成员hour, 此时(*p).hour也代表对象t中的成员hour,在这个例子中,p->hour、(*p).hour、t.hour三种表示是一个意思。
注:类的成员可以是其他类的对象,但不能以类自身的对象作为本类的成员,而类自身的指针和引用可以作为类的成员。
例1:输出时间(时:分:秒)
#include
using namespace std;
class Time
{ public:
int hour;
int minute;
int sec;
};
//第一种
int main()
{
Time t1;
cin>>t1.hour >>t1.minute>>t1.sec;
cout<<t1.hour<<":"<<t1.minute<<":"<<t1.sec<<endl;
Time t2;
cin>>t2.hour>>t2.minute>>t2.sec;
cout<<t2.hour<<":"<<t2.minute<<":"<<t2.sec<<endl;
return 0;
}
//第二种
int main()
{
void set_time( Time& ) ; // 使用引用形参
void show_time( Time& );
Time t1;
set_time(t1);
show_time(t1);
Time t2;
set_time(t2);
show_time(t2);
return 0;
}
void set_time(Time& t)
{
cin>>t.hour;
cin>>t.minute;
cin>>t.sec;
}
void show_time(Time& t)
{
cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;
}
//第三种
#include
using namespace std;
class Time
{
public:
void set_time() ;
void show_time();
private:
int hour;
int minute;
int sec;
};
int main()
{
Time t1;
t1.set_time();
t1.show_time();
Time t2;
t2.set_time();
t2.show_time();
return 0;
}
void Time::set_time()
{
cin>>hour;
cin>>minute;
cin>>sec;
}
void Time::show_time()
{
cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
例2:在整型数组中找最大值
#include
using namespace std;
class Array_max
{
public:
void set_value();
void max_value();
void show_value();
private:
int array[10];
int max;
};
void Array_max::set_value()
{ int i;
for (i=0;i<10;i++)
cin>>array[i];
}
void Array_max::max_value()
{ int i;
max=array[0];
for (i=1;i<10;i++)
if(array[i]>max) max=array[i];
}
void Array_max::show_value()
{
cout<<"max="<<max;
}
int main()
{
Array_max arrmax;
arrmax.set_value();
arrmax.max_value();
arrmax.show_value();
return 0;
}
C++ 通过类实现封装性,类的作用就是把数据和关于操作数据的算法封装在类类型中。在声明类时,一般将数据成员指定为私有,使它们与外界隔离,把让外界调用的成员函数指定为公有,外界通过公有函数实现对数据成员的访问。外界与对象的唯一联系就是调用公有成员函数。公有成员函数是用户使用类的公用接口。用户可以调用公有成员函数实现某些功能,用户也只要了解每个公有成员函数的功能,不必了解这些功能是怎样实现的,这就是接口与实现分离。
为了防止用户任意修改公有成员函数,从而改变对数据的操作,往往不让用户看到公有成员函数源代码。类中的数据是私有的,实现数据操作的细节对用户是隐蔽的,这种实现称为私有实现。这种类的公有接口与私有实现的分离形成了信息隐蔽。
信息隐蔽的长处是:
(1)如果想修改或扩充类的功能,只需修改类中有关的数据成员和成员函数,类外的部分不用修改。当接口与实现(对数据的操作)分离时,只要类的接口没有改变,对私有实现的修改不会影响程序的其他部分。
(2)如果在编译时发现类中的数据读写有错,不必检查整个程序,只需检查本类中访问这些数据的成员函数。这就使得程序(尤其是大程序)的设计、修改和调试变得方便和简单了。
面向对象程序开发时,一般将类的声明(包括成员函数的声明)放在指定的头文件中,在程序中只要把有关的头文件包含进来即可。不必在程序中重复写类的声明。还有一种方法是把类成员函数不定义在头文件中,而另外放在一个文件中。
在实际中,将若干个常用的功能相近的类声明集中在一起,形成类库。类库包括C++编译系统提供的标准类库,用户的类库。
类库有两个组成部分:
(1)类声明头文件
(2)经过编译的成员函数的定义,它是目标文件。
用户只要把类库装入C++编译系统所在的子目录中,并在程序中用include命令把类声明的头文件包括到程序中,就能使用这些类和其中的成员函数。