C++既是面向对象也是面向过程的语言,在这里就有一个重要的概念——类。
何谓类?类是对对象的一种抽象,举例来讲:每一个实实在在存在的人就是一个对象,人有很多共同的特征(一个头,两条腿,能走,能跑),这具有共同特征的人就成为一个类。类是一个抽象的名词,每一个人(即对象)是这个类的实例。
对象间具有的共同特征是对象的属性和行为。录像机是一个对象,它的属性是生产厂家、牌子、重量、颜色等等,它的行为就是它的功能,如录像、放像、快进、倒退等操作。
C++程序中,需要先定义一个类,形如:
Class 类名
{
定义变量;
….
定义函数
}
在类体中时成员列表,包括数据和操作数据的函数,即数据成员、成员函数。这体现了类的封装性和信息的隐蔽性。
成员函数一般在类体中声明,在类体外定义。
构造函数:对对象进行赋值
析构函数:在函数功能域结束时,释放对象成员的空间。
内联函数:为了节省函数调用的时间
完成各种功能函数…….
定义对象就需要对类进行实例化。形如:类名对象名
类是一个抽象,它不占任何内存,只有当其实例化成为对象之后,才会给其分配空间。
计算机中就是用对象来描述大千世界的事物。对象之间通过消息建立联系,借助函数完成各种各样的功能。
简单的说,这就是对象和类。
下面通过实例理解
【2-1】定义一个日C++类和对象期类date,该类对象存放一个日期,可以提供的操作有:取日期值,取年份,提取月份,提取日期以及设计日期值。
【分析】这个程序需要先定义一个类类型,这个类的数据成员有year,month,day,并且将其设计为private访问权限。还需要有5个成员函数,分别为:
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
28
29
30
31
32
33
34
35
36
|
void getdate(); //取日期值,格式为“year-month-day”
int getyear(); //取年份
int getmonth(); //取月份
int getday(); //取日期
void setdate( int y, int m, int d); //设置日期值
程序代码如下:
#include <iostream>
using namespace std;
class date
{
public :
void getdate();
int getyear();
int getmonth();
int getday();
void setdate( int y, int m, int d);
private :
int year,month,day;
};
int date::getyear(){ return year; }
int date::getmonth(){ return month; }
int date::getday(){ return day; }
void date::getdate()
{ cout<< "today is:" <<year<< "-" <<month<< "-" <<day<<endl; }
void date::setdate( int y, int m, int d)
{ year=y; month=m; day=d; }
int main()
{
date d;
d.setdate(2011,2,1);
cout<< "year=" <<d.getyear()<<endl;
cout<< "month=" <<d.getmonth()<<endl;
cout<< "day=" <<d.getday()<<endl;
d.getdate();
return 0;
}
|
【总结】这是一个最简单的类程序,但其中也存在不少问题。比如,如果没有setdate()函数,就无法对对象赋初值,而且必须按照特定的格式对对象进行设置初值。这个问题就应该采用构造函数来进行对象初始化。
【2-2】对例【2-1】进行改进,要求使用构造函数进行对象初始化,并且格式要不一致。
【分析】这个例子需要使用构造函数,并且要用到构造函数重载,使用默认参数值的构造函数和拷贝构造函数。
程序代码如下:
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
|
#include <iostream>
using namespace std;
class date
{
public :
date( int y=0, int m=0, int d=0)
{ year=y; month=m; day=d; }
date(date &d)
{ year=d.year; month=d.month; day=d.day; }
void getdate()
{ cout<< "today is:" <<year<< "-" <<month<< "-" <<day<<endl; }
int getyear() { return year; }
int getmonth() { return month; }
int getday() { return day; }
private :
int year,month,day;
};
int main()
{
date d1(2011,2,1),d2,d3(d1);
d1.getdate();
d2.getdate();
d3.getdate();
return 0;
}
|
【总结】程序中的对象d1有完整的实参表,则调用构造函数来进行对象初始化;对象d2没有实参表,系统同样自动调用构造函数进行对象初始化,只不过形参的值采用默认参数值进行初始化。对于对象d3,则采用拷贝构造函数进行初始化。
【2-3】输入数据到数组内求和、最大值、最小值与平均值后输出,将成员函数定义在类外。
【分析】这个程序时对C语言中所学内容的一个总结,是从面向过程到面向对象的跨越。这个类的数据成员应该包括数组。成员函数应该有数组输入函数、数组输出函数、求和函数、最大值函数、最小值函数和求平均值函数。
程序代码如下:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#include <iostream>
using namespace std;
#define N 10
class array
{
public :
void input();
void output();
int max();
int min();
int sum();
float average();
private :
int a[N],maxnumber,minnumber,sumnumber;
float avenumber;
};
void array::input()
{
int i=0;
cout<< "Please input " <<N<< " numbers:" <<endl;
for (i=0;i<N;i++)
{
cout<< "a[" <<i<< "]=" ;
cin>>a[i];
}
}
void array::output()
{
int i=0;
cout<< "array a is:" <<endl;
for (i=0;i<N;i++)
cout<<a[i]<< " " ;
cout<<endl;
}
int array::max()
{
int i;
maxnumber=a[0];
for (i=1;i<N;i++)
if (maxnumber<a[i])
maxnumber=a[i];
return maxnumber;
}
int array::min()
{
int i;
minnumber=a[0];
for (i=1;i<N;i++)
if (minnumber>a[i])
minnumber=a[i];
return minnumber;
}
int array::sum()
{
int i;
sumnumber=a[0];
for (i=1;i<N;i++)
sumnumber+=a[i];
return sumnumber;
}
float array::average()
{
float ave= static_cast < float >(sumnumber/N);
return ave;
}
int main()
{
array a;
a.input();
a.output();
cout<< "The max number is " <<a.max()<<endl;
cout<< "The min number is " <<a.min()<<endl;
cout<< "The sum number is " <<a.sum()<<endl;
cout<< "The average number is" <<a.average()<<endl;
return 0;
}
|
【总结】从上面的程序可以看出,类array里面包括对数组的各种操作,包括求和,求最大值,求最小值以及求平均值等。
【2-4】设计一个表示猫的类,包括猫的颜色、体重、年龄等数据,具有设置猫的颜色,修改和显示猫的体重、年龄等操作。
【分析】设计猫类的类名为Cat,此类有3个数据成员,颜色用string类表示,可以存放汉字,体重用实数类型表示,年龄用整数型表示,为了保护数据的安全性,3个数据成员全部为私有性。对猫的属性数据的设置和修改,全部为公有函数。
程序代码如下:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
#include <iostream>
#include <string>
using namespace std;
class Cat
{
public :
Cat(string c= "red" , float w=1, int a=1);
string get_color();
float get_weight();
int get_age();
void display();
private :
string color;
float weight;
int age;
};
Cat::Cat(string c, float w, int a)
{
color=c;
weight=w;
age=a;
}
string Cat::get_color()
{
return color;
}
float Cat::get_weight()
{
return weight;
}
int Cat::get_age()
{
return age;
}
void Cat::display()
{
cout<< "The color of this cat is " <<get_color()<<endl;
cout<< "The weight of this cat is " <<get_weight()<<endl;
cout<< "The age of this cat is " <<get_age()<<endl;
}
int main()
{
Cat c1,c2( "yellow" ,1,2);
cout<< "c1 is:" <<endl;
c1.display();
cout<< "c2 is:" <<endl;
c2.display();
return 0;
}
|
【总结】从上面的程序可以看出,构造函数可以用类对对象进行初始化,并且构造函数可以进行重载。
希望本文可以对大家学习c++编程语言有所帮助,也希望大家可以继续关注!