之前已经说过类有三大特性,封装,多态,继承。
C++是一个面向对象的程序设计语言。对象是什么?客观世界里的任何一个事物都可以看成一个对象。任何一个对象都具有两个要素,属性和行为。一个对象往往是由一组属性和一组行为构成的。
现在来说说封装。
所谓封装,一是将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相对独立,互不干扰。二是将对象中某些部分对外隐蔽,即隐蔽其内部细节,只留下少量接口以便与外界联系。
一、类和对象
类是C++中极为重要的概念。在C++中对象的类型叫类,类是对象的抽象,而对象是类的具体实例。
访问限定符
此三类修饰符在【Java】类和对象中有阐述,这里不做解释。
1、声明类类型
声明类的方法是由结构体类型的方法发展而来的。
class Student
{
int num;
char sex;
void display()
{
cout<<"num:"<<num<<endl;
cout<<"sex:"<<sex<<endl;
}
};
Student stu1,stu2;//定义了两个Student类的对象stu1,stu2。
class Student叫做类头,类头以下的花括号里的就是类体。类的声明以一个分号结束。
如果类的定义既不指定private,也不指定public,则系统默认为私有的。
综上得到类定义的一般形式:
class 类名
{ private :
私有的成员数据和成员函数
public:
公有的成员数据和成员函数
};//分号一定不能忘
2、定义对象的方法
(1)、先声明类类型,再定义对象。
(2)、在声明类类型的同时定义对象。
class Student
{
int num;
char sex;
void display()
{
cout<<"num:"<<num<<endl;
cout<<"sex:"<<sex<<endl;
}
}stu1,stu2;
(3)、不出现类名,直接定义对象
class
{
int num;
char sex;
void display()
{
cout<<"num:"<<num<<endl;
cout<<"sex:"<<sex<<endl;
}
}stu1,stu2;
二、类的成员函数
类的成员函数与其他函数的用法和作用基本上一样,但它是属于类的成员,出现在类体中。它可以被访问限定符修饰。
可以在类内声明,类外定义,也可以类内声明加定义。
(1)、构造函数:构造函数是一种特殊的成员函数,它是建立对象是自动建立的。构造函数的名字必须与类名同名并且不具有任何类型也没有返回值(这点java也具有),在建立对象时自动执行构造函数,它的作用是为该对象中的各数据成员赋初值0。类内类外都可以定义,在类外定义构造函数,需要在类内声明,要加上类名和域限定符”::“。[ 如果用户没有定义构造函数,则系统会生成一个构造函数 ]。———-无参的构造函数与全缺省的构造函数只能有一个存在。
(2)、拷贝构造函数
—–创建对象时,使用同类对象进行初始化
—–也属于构造函数的一种
—–属于构造函数的重载
—–必须使用引用传参,最好在引用前加上const
—–若未定义,系统会默认缺省的拷贝构造函数,依次对成员进行初始化
(3)、析构函数
——当一个对象的生命周期结束时,系统会自动调用一个析构函数,将其释放
——在类名前加上~,不能重载
——无参数,无返回值,一个类有且只有一个析构函数
——它的作用并不是删除对象,而是完成一些清理工作
(4)、运算符重载
运算符重载的方法是定义一个重载运算符的函数,运算符的重载实际上是函数的重载。
—–重载运算符的函数一般格式如下:
函数类型 operator 运算符名称 (形参表列)
{对运算符的重载处理}
注意:
5个C++不能重载的运算符: .* / :: / sizeof / ? / .
重载运算符的规则:
——C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。
——重载不能改变运算符运算对象(即操作数)的个数
——重载不能改变运算符的优先级
——重载不能改变运算符的结合性
——重载运算符的函数不能有默认的参数
——运算符重载函数可以是类的成员函数
三、隐含的this 指针
在每一个成员函数中都包含一个特殊的指针,这个指针的名字叫this,是固定的。它是指向本类对象的指针,它的值就是当前被调用的成员函数所在的对象的起始地址。
this指针是隐式使用的,它是作为参数被传递给成员函数的。
例如:
int Box :: volumn()
{return height*width*length;}
//程序运行时会转化为
int Box :: volumn(Box *this)//隐式指针this
{return this->height * this->width * this->length;}
//而在调用成员函数时,实际上是这样的:
a.volumn(&a);