什么是对象、类?
对象是一个系统的基本构成单位,对象可大可小,可以是一个学校一个班级也可以是一个学生。每一个对象都属于一个特定的类型而类代表了一批对象的特征。类是对象的抽象不占用内存而对象是类的具体实例占用储存空间。
相对于面向过程的程序使用类和对象将数据与函数分开,处理规模较大的程序时会更加方便,还有就是类具有封装性、继承性、多态性,类中的成员可以设置不同的访问权限:公有、私有、保护。
public:类内类外都可以访问,是类与外界的接口。
protected:类内及派生类成员可以访问。
private:仅本类成员可以访问。
一般将数据成员设置为私有成员,成员函数设置为公有成员,先定义类在定义对象。我们一般将类的定义分为两种,一种是数据类,用于存放需要用到的数据成员;一种是操作类,用于对数据进行操作(增删查改),一般包括构造函数、get、set函数、display函数等。
类的定义:
class 类名
{
public:
protected: //不能以类自身作为本类的成员,自身的指针和引用可以。
private: //在类中没有说明成员类型的默认为私有成员,而在结构体中默认为共有成员。
}; //类以分号作为结束,一定不要忘记分号!
类成员的访问:对象名.公有成员(原点调用)
对象名(指针变量)->公有成员(指针调用)
说明对象:
静态的:可以加参数(类似变量);
动态的:用new申请定义指针类。需要注意的时用new申请的空间最后必须用delete+对象名来消除动态申请 。
成员函数在类外的说明:函数类型 类名 ::成员函数名(参数){......}
内联函数:
编译时将函数以代码代替来节约时间,适用于小函数,因为这样会占用内存所以不能含有复杂语句不能含有递归否则把内存占满程序就无法运行了。定义:inline 函数原型。
函数重载:函数名相同参数的类型或个数不同。
例如:int abs(int a);1
double abs(double f);2
cout<<abs(5)<<endl; //调用1
cout<<abs(7.8)<<endl; //调用2
int max(int a, int b);3
int max(int a,int b, int c);4
cout<<max(5,3)<<endl; //调用3
cout<<max(4,3,2)<<endl;//调用4
构造函数:
在创建对象时系统自动调用构造函数来进行对象的初始化(构造函数同样可以重载)。
class Student
{
public:
Student() //构造函数名与类名相同
{ } //使用构造函数函数体对数据成员赋初值
Student(int,int,int) //带参数的构造函数
}; //一定不要忘记以分号结尾
int main()
{Student c(12,25,30); //此时调用带参数的构造函数对数据成员进行赋初值
Student b; //此时调用不带参数的构造函数
}
在类外说明构造函数的形式: 类名::类名(){ }
需要注意的是若类中没有定义构造函数那么系统会自动会生成一个缺省版本的构造函数,当用户定义了构造函数则缺省的构造函数不再起作用所以写程序时构造函数一般写两个一个有参一个无参。
数据成员的初始化一般有两种方法:
一个是用构造函数的函数体进行赋值;一个是使用构造函数初始化列表。
构造函数初始化列表例如: Box :: Box (int h,int w,int len):height(h),width(w),length(len){ }//此时形参h,w,len的值就分别赋给了height,width,length。
必须使用初始化列表的情况有:
当数据成员为常量时、数据成员为引用类型、数据成员为没有无参构造函数的对象。
析构函数:
析构函数无返回值、无参数、由系统自动调用
构造函数系统自动调用用于构造对象,而析构函数用于释放对象,一个类中可以有多个构造函数但只能有一个析构函数。
定义:类名::~类名();
this指针:
指向本类的对象的指针,值为当前被调用的成员函数所在的对象的起始地址,系统自动进行分配。
可以用于避免对同一对象进行操作、返回对象本身*this就是this所指向的对象。
对象的复制
复制构造函数:
将成员值赋给新的对象中对应的成员。
Box box2(box1) //用box1初始化box2
Box box2=box1; //用box1初始化box2
浅复制:
当对象box2复制box1时,box1和box2的指针指向了同一个位置,适用于比较简单的情况。
深复制:
用new申请空间,复制时将整体全部复制包括数据,他们的指针指向不同的位置 ,适用于比较复杂的情况。
常对象成员:常数据成员和常成员函数
声明:const int hour;//声明hour为常数据成员;常数据成员只能通过初始化列表进行初始化,并且不能进行赋值。
声明:void gettime()const; //声明gettime为常函数成员,只能引用数据成员不能修改他们的值,只读不写。
静态成员:
静态成员为所有对象共有,它的值对所有对象的值都是一样的一改每个对象中就都变了 ,可以节约空间提高效率。
声明:static+类型+名字
class Box
{static int height; //定义静态数据成员
};
int Box::height=10; //数据成员的初始化(只能在类外初始化)
友元函数:
一般类中的private成员只有本类的函数可以访问,但友元可以访问类中的private成员所以友元函数破环了类的封装性所以一般不建议使用,多用于运算符的重载。
写程序的步骤:
使用类写程序时首先想的是需要哪些数据,这个程序需要实现哪些功能,将需要的功能进行分类汇总,然后写程序调试。
调试:
每写一个类首先把他调通,每加一个功能先把它调通(滚雪球法)
先调试数据类在调试操作类
注意:
操作类型关注功能实现但一定要有数据成员且数据成员为集合类型 ;成员函数名要有意义,若名字中有两个单词一般第二个单词首字母大写。
总结:
类作为面向对象的主要内容它主要的特点是具有封装性,它将数据与操作分离开来。与面向过程相比有了各自的分工,可以使用不同的类来解决不同类型的问题,比如数据类和操作类有不同的分工。在写程序时使用滚雪球法,将一个个实现不同功能的小程序组合在一起,就像是滚雪球一样慢慢的增大程序的规模和功能 。个个类之间既是一个整体又相互联系,在需要时可以将之前打的实现某个功能的类直接复制过来,让程序更加灵活多变。