类在C++中十分的重要,所以必须重点掌握好它。
首先,我们要知道类基于面向对象的三大特性:封装、继承、多态。
那么,什么是类和对象呢?
类:像是一种自定义类型,如C中的struct,是对一件事物的抽象,具体的描述事物的属性和功能。不占用内存。
对象:是类的实例化, 是具体的,占用内存。
以下介绍的是类其中的一个特性------封装。
封装:就是类+限定符。在类的限定符有三个-----public(公有),protected(保护),private(私有),若未说明,默认类中的成员是private的。而只有public中的成员可以被类外所访问,protected和private中的成员不可以。因为C++要兼容C,所以由上可知struct中的成员是public的。
类的成员的有两种----成员变量(对象的属性),成员函数(对象的方法)。与C中struct种不同,class中既可以定义变量,也可以定义函数。这就体现了类的快捷。
那么,一个类中要是既有成员变量,又有成员函数怎么计算一个类的对象的大小?我们知道变量的大小可以求出,而函数的大小好像并没有这个说法,所以规定类的大小----只算成员变量的大小(依据内存对其)。那么,一个空类或者一个没有成员变量的类的大小,规定其大小为一个字节。
在类中有两个十分重要的知识点:this指针和默认成员函数。
- 类的this指针:了解this指针,我们看一下在日期类中,在每个成员函数中,都有一个指针,它是隐藏着的,称为this指针,它指向当前对象,也就是当前对象的首地址,通过this指针,你可以访问到当前对象的成员变量和成员函数(除了在类中有static修饰的函数外)。这在之后会讲在类中用static修饰的函数和变量意味着什么。
那么,什么是当前对象?在下面中的例子中,解释了当前对象就是,你再哪个对象中调用了类中的函数,函数中的this指针就是那个对象。下例中,在d1中调用了>函数,所以this指针中的内容就是d1中的内容。
我们还需要关于this指针的几个重点:1.this是常量指针,故它的值不能被修改。2.this指针只能在成员函数中才能使用。3.被static修饰的成员函数不能使用this指针。
-
class Date { public: void SetDate(int year, int month, int day) { _year = year; _month = month; _day = day; } bool operator>(const Date& d) { if (this->_year > d._year || (this->_year == d._year&&this->_month > d._month) || (this->_year == d._year&&this->_month == d._month&&this->_day > d._day)) return true; else return false; } private: int _year; int _month; int _day; }; int main() { Date d1, d2; d1.SetDate(1900, 1, 1); d2.SetDate(2018, 11, 8); if (d1 > d2) cout << "d1>d2" << endl; else cout << "d1<d2" << endl; system("pause"); return 0; }
类的默认成员函数:
1.构造函数:构造函数用于解决对象的初始化问题,下列用到了参数缺省和初始化列表。都是十分简单的操作。以下是构造函数需要注意的几点:1.构造函数以类同名。2.构造函数与其他函数不一样,不需要被调用。例:d1(2018,11,8)。
Date (int year = 1900, int month = 1, int day = 1)
:_year(year)
, _month(month)
, _day(day)
{
}
2.析构函数:当一个对象的生命周期结束时,C++编译系统会调用一个成员函数(析构函数)。析构函数在对象销毁时调用(释放资源)。若没有显式定义析构函数,系统会生成默认的析构函数。尤其创建对象时在堆上开辟了空间(malloc、realloc、calloc),为了避免内存泄漏等问题,必须将开辟的空间归还,这就是析构函数的作用。
class Date
{
public:
~Date()
{}
private:
int _year;
int _month;
int _day;
};
3.拷贝构造函数:默认的构造函数,创建对象时用已存在的对象来初始化,其实相当于一个构造函数的重载,构造函数的参数只有一个(类类型),且必须使用引用传参,否则会引发无穷递归调用。
Date (const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
4.运算符重载:运算符重载的特征为----operator+运算符。本质上是函数重载,且重载不改变操作对象的个数、当运算符重载后,其优先级和结合性不会被改变。
bool operator>(const Date& d)
{
Date d1(*this);
if (d1._year > d._year ||
(d1._year == d._year&&d1._month > d._month) ||
(d1._year == d._year&&d1._month == d._month&&d1._day > d._day))
return true;
else
return false;
}