- 类的说明部分
封装,是面向对象程序设计最基本的特性,把数据(属性)和函数(操作)合成一个整体,这在计算机中是用类和对象进行实现的。
封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
Class CDate
{
Public:
Void SetDate(int y,int m,int d);(公有数据成员和成员函数)
Void ShowDate();
Private:
Int Year;Month,Day;
}
访问控制属性有以下三种类型:
- 共有类型(public)
外部访问接口,只有这个类型下的才可以被外部进行访问。
- 私有类型(private)
这三个数据成员只能由其成员函数SetDate和ShowDate进行访问。
- 保护类型(protected)
类定义的说明部分应注意以下事项:
- 在类内定义数据成员时不允许对数据成员进行初始化:因为类是一个数据类型,定义后并没有存储空间,就像int类型一样,他里面也是没有初始化的,只要进行初始化,就会占用内存空间。和结构体一样的,(但是静态数据成员可以在类外进行初始化)
- 类的数据类型可以是任意的,包括整型、浮点型、字符型等,还可以包含类。
- 在类定义的说明部分后必须加分号“;”
- 一般在类中先说明共有public成员,再说明私有成员(private).因为公有成员是类的外部接口,也是使用的最多的时候。私有成员只是为公有成员的函数进行服务的。
- 一般将类定义的说明部分放在一个头文件中,而将它的实现部分放在一个源文件中。
- 类的实现部分
类的说明部分就相当于在C程序中,要调用一个函数首先进行声明一样。而类的实现部分主要是这个函数的实现过程,也就是这个函数主要的程序架构。
与普通函数不同的是,类外定义成员函数时要指明其所属类的名称,具体形式为:
返回值类型 类名::函数成员名(参数)
{
函数体
}
Void CDate::SetData(int y,int m,int d)
{
Year= y;
Month = m;//私有成员是为公有成员服务的吧,这你就知道为什么用户只要关心公有成员了吧。
}
- 类的成员函数
- 内联成员函数
成员函数可以在类的体内定义也可以在类的体外定义,其中在类内定义的函数被看作内联函数,也就是将类的实现部分放在其说明部分。而在类外部定义的函数默认情况下都是非内联函数。但是为什么需要使用内联函数呢?使用内联函数又有什么好处呢?我们都知道,函数的调用过程是要消耗内存资源来记录调用时的状态和返回地址的。而内联函数,则是在编译的时候将函数体插入到每个调用它的地方。这样虽然可以减少系统调用时间,提高执行效率,但是缺点也是很明显的,就是增加了程序的代码长度;所以我们还是将频繁调用的几个简单的函数写成内联函数的形式,而将较复杂的函数定义为非内联函数。
其中将成员函数声明为内联函数一般有两种方式:隐式声明和显式声明。
如果将成员函数的函数体直接放在类定义体内,则该成员函数即为内联函数,这种方式为隐式声明。
Class CDate
{
Public:
Void SetDate(int y,int m,int d);(公有数据成员和成员函数)
Void ShowDate()//注意如果在类内进行函数实现的话,并不需要添加类名
{
Printf(“I am a neilian function\n”);
}
Private:
Int Year;Month,Day;
};(分号可不能忘了啊)
一般我们并不采用隐士的方式而是采用显式的方式,因为内联函数的声明在.h文件中,实现在源文件中。因此为了方便程序的可读性,将所有函数的实现部分都放在源文件中。显示的话就是在函数前加关键字inline ,如下:
Inline void CDate::SetDate()
{
Printf(“I am neilian function also\n”);
}
- 带缺省参数的成员函数
类的函数调用的方法:
如果我们声明了一个类,那么在主函数中该如何使用这个函数呢?
//函数实现
Void CDate::SetData(int y=2008,int m=1,int d=1)
{
Year= y;
Month = m;
Day = d;
}
Void CDate::ShowDate()
{
Printf(“%d%d%d”,Year,Month,Day);
}
Void main()
{
CDate Date1,Date2;
Date1.SetDate();
Date2.SetDate(2018,8,24);
Date1.showDate();
Date2.showDate();
}
结果为:
2008 1 1
2008 8 24
- 成员函数重载
函数重载是指一个函数名对应着多种函数实现。再C++中,函数重载允许同一作用域内的同一个函数名可以声明多个函数,他们可以完成不同的功能。可以带不同个数、不同类型的参数。
Public:
Int abs(int m);
Double abs(double s);
- 对象
- 创建对象
首先什么是对象,类和结构体、int一样都是一种数据类型,而对象就是类所定义的变量。变量名即是某个具体对象的标识。
因此我们要想使用类,必须定义类的变量,类的变量在C++中称为对象(object),也成为类的实例(instance)。
和其他变量一样,对象也要先定义再使用。定义一个类的对象,就是再内存中开辟出一块空间来保存该对象的数据成员。可以采用两种方式来定义对象。
- 同普通变量一样,在进行类的声明之后
CDate Date1,Date2;
CDate *pDate = &Date1;
CDate &tDate = Date2;
其中定义了两个日期对象,一个日期型对象的指针pDate 和引用tDate。在C++中,一个类数据类型的变量称为对象。必须先对类进行声明,再使用该类定义对象。
- 在声明类时直接定义对象,一般不这样使用,除非你是写一个demo,为了方便。
Class CDate
{
Public:
函数体
Private:
函数
} Date1,Date2,*pDate ,&tDate;
上面这两种定义对象的方式效果是完全一样的。
- 成员的访问
定义了类和对象之后就可以通过对象来访问其公有成员了。外部不能访问私有和保护成员。
采用成员操作符“.”来访问公有成员,其一般形式是:
对象名.公有成员函数名(参数表)
对象名.公有数据成员名
如果是指针则采用操作符->
Void main()
{
CDate Date1,Date2,*pDate = &Date1,
Date1.SetDate();
Date2.SetDate(2018,8,24);
pDate ->showDate();
Date2.showDate();
}