类与对象
1.类的抽象与封装
什么是抽象?
即把描述人员的工号,姓名,年龄等静态属性抽成数据:(数据抽象)
int id;
string name;
int age;
把描述请假、统计工资等动态行为抽象:(行为抽象)
void qingjia();
void gongzi();
数据和函数都是类的组成部分,称之为成员。
再在上述基础上进行封装,
class Date{
private:public:
};
在类外部每个成员函数的格式如下:
返回类型 类名::成员函数名(参数列表) { 函数体 }
注意:在定义类的时候不能对数据成员进行赋值,因为类只是一种数据类型,不占用储存空间,而变量的值需要内存来存储。
对类进行实例化,即创建对象:
类是抽象的,不占用内存,而对象是具体的,占用储存空间。
下面是声明一个类对象的格式:
类名 对象名
2.对象的使用
1)".“运算符来访问成员
2)通过指向对象的指针”->"访问成员
3)通过对象的引用变量访问对象中的成员
对象名.成员函数名(参数列表)
对象名.数据成员名
stud1.display();
stdu1.num=100;
对象名->成员名
Time t,*p;定义对象t和指针p
p=&t;使p指向对象t
cout<<p指向的对象中的成员hour:p->hour<<endl;
Time t1;
Time &t2=t1;
cout<<t2.hour<<endl;
t1和t2共同占用一段储存空间,实际是一个对象,只是用不同名字表示罢了。
3.构造函数
构造函数与类同名,没有函数返回值类型,也没有函数返回值。
作用:初始化工作
原因:声明类的时候不能直接对数据成员赋初值
如果定义了构造函数,编译系统就不会再为其生成隐含的构造函数,所以如果需要用到无参构造函数(原先是系统自动生成),就得在类中显示定义,不然会出错。
4.复制构造函数
其唯一的形参必须是引用
Point(Point &p)
{
x=p.x;
y=p.y;
}
与普通构造函数一样,系统会自动生成一个缺省的拷贝构造函数
类名::类名(类名 &对象名)
{
*this=对象名;
}
5.析构函数
~Point()
析构函数由~和类名构成。
1)指向对象的指针
2)指向类对象成员的:
类型说明符 类名::*数据成员指针名;
数据成员指针名=&类名::数据成员名;
即
int Time::*p1;
p1=&Time::t1.hour;
指向类成员函数
void(Time::*p2)();
p2=&Time::gettime;
gettime是函数名。
6.对象引用和参数传递
1.通过对象指针传递
void Add(Point *p);
//在main函数里
Point ob;
ob.Add(&ob);
2.通过对象引用传入
类名&对象名
class Point{
void Add(Point &p)//形参是对象引用
};
main函数里
Point ob(1,2);
ob.Add(ob)
比起指针传递,这个方式更加直接。