类与对象
对象
一个班级作为一个对象时有两个要素:一是班级的静态特征,如班级所属系和专业,学生人数,所在的教室等,这种静态特征称为属性;二是班级的动态特征,如学习、开会等,这种动态特征称为行为(或功能)。任何一个对象都应当具有两个要素,即属性和行为。对象是由一组属性和一组行为构成的。
类和对象的关系
类是对象的抽象,而对象是类的具体实例。好比建造房屋先要设计图纸,然后按图纸在不同的地方建造若干栋同类的房屋。可以说类是对象的模板,是用来定义对象的一种抽象类型。
类是抽象的,不占用内存,而对象是具体的,占用储存空间。
声明类类型
类是用户建立的类型。如果程序中要用到类类型,必须自己根据需要进行声明,或者使用别人已设计好的类。下面是我们已熟悉的声明一个类类型:
class Student
{
int num;
char name[20];
char sex;
void display()
{
cout<<"num:"<<num<<endll;
cout<<"name:"<<name<<endll;
cout<<"sex:"<<sex<<endll;
}
};
class是声明类时必须使用的关键字,类体是用一对花括号括起来的。类的声明以分号结束。
在类体中是类的成员表,列出类中的全部成员。除了数据以外,还包括对这些数据操作的函数。
成员访问限定符:public:公用的,既可以被本类中的成员函数所引用,也可以被类的作用域的其他函数所引用。
private:私有的,只能被本类中的成员函数引用,类外不能调用(友元类除外)。
protected:受保护的,不能被类外访问,但可以被派生类的成员函数访问。
定义对象的方法
1.先声明类类型,然后再定义对象
Student stu1,stu2;
2.声明类的同时定义对象
class Student
{
punlic:
int num;
char name[20];
char sex;
void display()
{
cout<<"num:"<<num<<endll;
cout<<"name:"<<name<<endll;
cout<<"sex:"<<sex<<endll;
}
}stu1,stu2;
类的成员函数
成员函数的性质
它与一般函数的区别为:它是属于一个类的成员,出现在类体中。它可以被指定为public,protected,和private。
在类外定义成员函数
void Student::display()
{
cout<<"num:"<<num<<endll;
cout<<"name:"<<name<<endll;
cout<<"sex:"<<sex<<endll;
}
成员函数在类外定义时,必须在函数名前面加以类名,予以限定符::
内置成员函数
成员函数的储存方式
不论成员函数在类内还是类外定义,成员函数的代码段的储存方式是相同的,都不占用对象的储存空间。
对象成员的引用
通过对象名和成员运算符访问对象中的成员
访问对象中成员的一般形式为:
对象名.成员名
如;stu1.display();
通过指向对象的指针访问对象中的成员
如:
Time t,*p; p=&t; cout<<p->hour;
通过对象的引用来访问对象中的成员
如果为一个对象定义了一个引用,那么它就是对象的“别名”。
如:Time t1; Time &t2=t1; cout<<t2.hour;
利用构造函数对类对象进行初始化
不能在类声明中对数据成员初始化,因为类并不是一个实体,而是一种抽象类型,并不占储存空间,显然无处容纳数据。
可以用构造函数处理对象的初始化,其名字与类名同名。
class time
{
public:
time()
{
hour=0;
minute=0;
sec=0;
}
private:
int hour;
int minute;
int sec;
};
在建立对象时自动调用构造函数。
带参数的构造函数:
class time
{
public:
time(int h,int m,int s)
{
hour=h;
minute=m;
sec=s;
}
private:
int hour;
int minute;
int sec;
};
析构函数
它的作用与构造函数相反,它的名字是类名前加一个“~”符号。
- 自动局部对象:函数调用结束时,对象释放前自动执行析构函数。
- 静态局部对象:只在main函数或调用exit函数结束程序时,才调用static局部对象的析构函数。
- 全局对象:在程序的流程离开其作用域时,才调用其析构函数。
- new运算符动态建立的对象,当用delete运算符释放该对象时,先调用该对象的析构函数。
先构造的后析构,后构造的先析构。
对象数组
数组不仅可以由简单变量组成,也可以由类对象组成。(数组中的每一个元素都是类的对象),此时可以用下标来操作数组中的对象。
对象指针
就像结构体有指向结构体变量的指针一样,类也有指向类对象的指针。
- 指向对象的指针
- 指向对象成员的指针
- this指针:每一个成员函数都有一个this指针,指向本类对象,它的值是当前被调用的成员函数所在的对象的起始地址。
静态成员
某时人们希望某一个数据成员为全体对象所共有,这时可以用静态的数据成员
- 静态的数据成员:静态的数据成员在内存中只占一份空间,由全体对象共用。
如:static int c=10;
可以初始化,但是只能在声明中初始化。静态数据成员既可以用对象名来引用,也可以用类名来引用
-静态成员函数:和静态数据成员一样,静态成员函数也是类的一部分,如果在类外调用静态成员函数,有两种形式:- ` 类名::函数名();
- 对象名.函数名();
静态成员函数没有this指针,主要用来访问静态数据成员。