c++面向对象中,算法与数据结构被捆绑成一个类
对象:算法+数据结构
程序:对象+对象+.....
什么是类: 类是定义同一类所有对象的变量和方法的蓝图或原型
类是对象的抽象,而对象是类的具体实例
类是抽象的,不占内存,而对象是具体的,占内存空间,类与对象的关系好比动物与猴子的关系。
类的封装性,用来保护内部成员,外部要访问需要类定义的访问接口来进行。
在类中定义成员函数:
类中定义的成员函数一般为内联函数,即使没有明确inline标识
c++中,类定义通常在头文件中,因此这些成员函数定义也伴随着进入头文件
在类之后定义成员函数:
c++允许在其他地方定义成员函数
将类定义和其他成员函数定义分开,是目前开发程序的通常做法
我们把类定义(头文件)看成是累的外部接口,累的成员函数定义看成是类的内部实现
例如:
#include<iostream>
using namespace std;
class Date
{
private: //可不写,默认为private
int year;
int month;
int day;
public:
Date(){year=2015;month=9;day=17; } <span style="color:#ff0000;">//构造函数的重载,两种不同的赋值方法</span>
Date(int x,int y):year(x),month(y),day(15){}
Date(int x,int y,int z):year(x),month(y),day(z){}
~Date(){} <span style="color:#ff0000;">//析构函数</span>
void set(int x,int y,int z); <span style="color:#ff0000;">//在类外进行函数定义</span>
void show()
{
cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;
}
};
void Date::set(int x,int y,int z) <span style="color:#ff0000;">//外部定义类函数的两种书写方法</span>
{
this->year=x;
this->month=y;
this->day=z;
}
#if 0
Date::void set(int x,int y int z)
{
year=x;
month=y;
day=z;
}
#endif
int main()
{
Date date1; <span style="color:#ff0000;">//三种不同的构造函数</span>
Date date2(2012,3);
Date date3(2008,8,18);
date1.show();<span style="white-space:pre"> </span><span style="color:#ff0000;">//类显示接口</span>
date2.show();
date3.show();
date3.set(2017,8,20); <span style="color:#ff0000;">//调用类外部设置接口</span>
date3.show();
return 0;
}
skywalker@skywalker:~/work/test$ ./a.out
2015年9月17日
2012年3月15日
2008年8月18日
2017年8月20日
保护成员:protected:
除了友元函数和子类的成员函数外,从类的外部就不能对它们进行访问
私有成员:private:
从累的外部就不能对其进行访问
公共成员:public:
公共成员在任何地方都可以被访问
封装的概念:
类的封装的概念首先是,数据与算法结合,构成一个不可分割的整体(对象);
其次是,在这个整体中一些成员是被保护的,它们被有效的屏蔽,以防外界的干扰和误操作;
另一些成员是公共的,它们作为接口提供外界使用,而该对象的描述即是创建用户定义的类型,对c++来说,就是类的实现机制。
封装优点:
1:重用;
2:不必关心具体的实现;
3:具有安全性。
构造函数和析构函数:
构造和析构函数,使得类对象能轻灵的创建和撤销
构造函数创建类对象,析构函数撤销类对象
构造和析构函数是类的特殊成员函数
对象的初始化:
建立对象,须有一个有意义的初始值
c++建立和初始化对象的过程专门由该类的构造函数来完成
构造函数给对象分配空间和初始化
如果一个类没有专门的构造函数,那么c++就仅仅创建对象而不做任何初始化
类的对象的初始化只能由类的成员函数来进行
建立对象的同时,自动调用构造函数
类对象的定义涉及到一个类名和一个对象名
由于类的唯一性和对象的多样性,用类名而不是对象名来作为构造函数名是比较合适的 (类名=构造函数名)
构造函数没有返回值
对象的撤销:
析构函数完成对象的撤销
也是类的成员函数
其作用是善后处理
析构函数名,就在构造函数前加上一个一个逻辑非运算‘~’,表示逆构造函数。