面向对象编程
A:面向对象编程??我没有对象,怎么编程??
B:同学想啥呢??这里所说的对象是类的实例化。
类:类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。
这有点像C语言中的结构,唯一不同的就是结构没有定义所说的“数据相关的操作”,“数据相关的操作”就是我们平常经常看到的“方法”,因此,类具有更高的抽象性,类中的数据具有隐藏性,类还具有封装性。
类具有三大特性:封装、继承、多态。
类的成员有两种类型:
类内含有三种访问限定符:
- public:类内类外均可访问,也是类与类外交流通道。
private:只能类内访问,类内没有定义限定符,默认为私有的。子类不可访问。
protected:只能类内访问,子类可以访问。
默认成员函数
默认成员函数:与缺省成员变量的道理一样,标准库里有内置类型的这四类默认函数,如果用户未定义这四类函数,编译器器会调用默认函数,用户有定义,就会调用用户的。自定义类型,标准库里是没有这些默认函数的,需要用户自己去实现。
class Time{
public:
Time(const int hour=23, const int minute=59, const int second=59)
:_hour(hour)
,_minute(minute)
,_second(second)
{
}
Time(const Time&t)
:_hour(t._hour)
, _minute(t._minute)
, _second(t._second)
{
}
Time&operator=(const Time&t)
{
_hour = t._hour;
_minute = t._minute;
_second = t._second;
return*this;
}
~Time()
{}
private:
int _hour;
int _minute;
int _second;
};
int main()
{
Time t1(13, 59, 59);
Time t2(t1);
Time t3 = t1;
Time t4;
t4 = t2;
return 0;
}
构造函数
构造函数可以放在初始化列表,也可以放在构造函数中去初始化。构造函数。顾名思义就是就创造这个实例,并对它初始化。建议采用成员初始化列表进行构造函数初始化,可以提高效率。因为即使参数列表为空编译器也会去检查参数列表。
构造函数与类名相同,对象实例化时候系统自动调用。
Time(const int&hour,const int&minute,const int&second)
:_hour(hour)
,_minute(minute)
,_second(second)
{
}
/*Time(const int hour=23, const int minute=59, const int second=59)
:_hour(hour)
,_minute(minute)
,_second(second)
{
}*/
拷贝构造函数
构造函数的一种,拷贝构造函数的参数必须采用引用,使用传值则会引发无限递归。所谓无限递归实际是这样的,如果传值调用拷贝构造函数,那么拷贝构造函数的参数列表本来就是原变量的临时拷贝,现在又要用这个临时拷贝去拷贝给另一个对象。
Time(const Time&t)
:_hour(t._hour)
, _minute(t._minute)
, _second(t._second)
{
}
析构函数
析构函数无参无返回值,~类名(),析构函数不允许重载,析构函数做清理工作,并不是删除对象。在对象生命周期结束自动调用。
~Time()
{}
赋值操作符重载
Time&operator=(const Time&t)
{
_hour = t._hour;
_minute = t._minute;
_second = t._second;
return*this;
}
这些函数在使用中容易混淆
Time t1(13, 59, 59);//调用构造函数初始化
Time t2(t1);//拷贝构造初始化
Time t3 = t1;//拷贝构造初始化
Time t4;//缺省拷贝构造
t4 = t2;//赋值操作符重载