#对象#
具有某种身份的事物就是对象
在应用领域中有意义的、与所要解决的问题有关系的任何事物都可以作为对象,它既可以是具体的物理实体的抽象,也可以是人为的概念,或者是人和有明确边界和意义的东西。任何事物都可以用对象来进行描述——万物皆对象。
##C++中对象的定义
对象是一组数据以及对这组数据有关操作组合封装的实体,这组数据也可以称为对象的具体属性,例如人的身高、体重;有关操作可以理解为对象的行为,如,读书、写字
##对象的性质
对象具有唯一性,正如世界上没有相同的树叶一样,每个对象都是独一无二的。在C++中,每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。
#类
具有相同属性(数据元素)和行为(功能)的对象的抽象就是类
类的实质是一种数据类型,由用户自定义的数据类型。在编程中,类不能直接进行操作,需要用类定义具体的对象,对这对象进行操作。类是对象的抽象,对象是类的实现。
##类的性质
封装性
将数据和操作封装为一个有机的整体,由于类中私有成员都是隐藏的,只向外部提供有限的接口,所以能够保证内部的高内聚性和与外部的低耦合性。
继承性
继承性更符合认知规律,使程序更易于理解,同时节省不必要的重复代码。
多态性
同一操作作用于不同对象,可以有不同的解释,产生不同的执行结果。
##类的实现及基本结构
C++中的类与C语言中的结构体非常相似,区别是类由class开头,结构体由struct开始,最重要的就是类中的数据及操作默认为私有,不特别规定不能调用,结构体则相反,另外关于构造函数以及析构函数等下面讲。
类由数据成员以及在数据成员进行操作的方法组成
class Test//类名
{
int a;//数据成员
int b;//数据成员
void getAB()//方法 得到a、b的值
{
cout <<a <<" " << b;
}
};//分号结束
注意事项:类在命名时首字母大写
##类内的访问权限
前面提到类内成员在不做特殊规定时,内部成员不能调用,这主要是C++在设计是对数据安全性进行的考虑,如果类中的数据可以随意访问调用将造成极大的安全隐患。C++为类内的成员提供三种权限:public(公有)、protected(保护)、private(私有)
public:公有的,这种权限下类内成员可以随意调用
protected:这种权限下类内成员只能被本类成员以及派生类调用(友元除外)
pravate:这种权限下类内成员只能由本类的成员调用(友元除外)
class Test2
{
public:
int a;//公有数据成员
private:
int b;//私有数据成员
protected:
int c;//被保护的数据成员
public:
int setABC(int a,int b, int c)//公有成员方法
{
this->a = a;
this->b = b;
this->c = c;
}
void getABC()//公有成员方法
{
cout <<a <<" " << b<<" "<< c;
}
};
在C++中类内权限范围由权限标识开始到下一个权限标识或类的定义止,这一范围内都为前一标识的作用范围,例如setABC()、getABC()都为公有权限
类内的私有权限的数据成员只能由本类的成员调用,例如setABC()、getABC()可以操作数据新成员 c
##this
在C++中提供了一种指针——this指针,使用它在成员函数中来代替对象本身来对数据成员进行操作,例如Test2中setABC方法使用this来对abc进行赋值,如果我们不用this,直接用数据成员 来进行操作
int setABC(int a,int b, int c)//公有成员方法
{
a = a;
b = b;
c = c;
}
那么编译器将会报错,因为指代不明
this指针不是我们定义的,在对象创建时由编译器自动生成,this的使用范围只限于类内成员函数中使用
##构造函数以及析构函数
类定义好了,我们要使用它,但是类的本质是一种数据类型,我们并不能直接对类进行操作,参照结构体 我们可以使用类名来定义一个变量,这个变量就叫做对象。在创建变量的时候都可以进行初始化,对数据进行初步赋值,对象当然也可以进行初始化,C++为我们提供了构造函数
其实无论Test 还是Test2 类,编译器都自动加上了构造函数,这是类的必要组成部分,我们不写当然不会报错,编译器会帮我们加上一个默认的构造函数
构造函数与类名相同,没有返回类型,一个类中可以编写多个参数列表不同的构造函数——构造函数支持重载,另外构造函数支持参数列表初始化
Test2()
{
a = 1;
b = 2;
c = 3;
}
Test2(int a, int b)
{
this->a = a;
this->b = b;
c = 3;
}
Test2(int a, int b, int c):a(a),b(b),c(c){}
析构函数与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。
~Test2(){}
##继承
通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。
继承有三种继承方式,公有继承(public)、保护继承(protected)、私有继承(private)
- 公有继承(public):
公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。 - 私有继承(private):
私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。 - 保护继承(protected):
保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。
下面列出三种不同的继承方式的基类特性和派生类特性。
public protected private
公有继承 public protected 不可见
私有继承 private private 不可见
保护继承 protected protected 不可见
继承格式
class Test3:public Test2
{
};