什么是类:
在C++中类是一种较为特殊的数据结构,它更像是从结构体中演变而来的。通过定义自己的类去定义一种新的数据类型,并且也可以在类中定义成员函数,对你所定义的具体的数据类型进行相应的操作。
类的哲学:
从现实世界中我们可以对具体的事物进行分类。比如:人类—>男人,女人。它更加的抽象,但是有这种面向对象的思想编程也是比较合适的。
类的语法:
首先,我们要定义一种新的数据类型,才能定义某个具体类型的变量。
定义数据类型时,从访问控制上分类有三类:public,private(缺省时默认),protect三类,从成员类型上分为:数据成员和函数成员,最广泛的划分分为静态成员(属于整个类)和非静态成员(属于某个具体的对象)。public修饰的成员可以通过对象的引用、对象的指针、对象名.成员名来进行访问,static修饰的静态成员也可以通过“::”来操作。private修饰的成员只能在类作用域(成员函数体内和类内)内进行访问,这条是铁律。protected成员暂且不谈。
定义具体的变量时,我们要保证我们所定义的这个类(数据类型)是完整的,只有这样编译器才能知道应该分配多大的内存空间。比如:我们先定义class A,后定义class B,但如果在类中A定义类B的具体对象时就会出现错误。即使使用前向引用声明也只能定义指向类B的指针,而不能得到B的任何细节。
构造函数和析构函数:
在对象初始化时都会调用构造函数,如果你没有定义任何构造函数,则编译器会自动生成一个默认构造函数,如果你定义了任何一种构造函数,那么编译器都不会再定义默认构造函数,此时定义对象时定义了其他构造函数但是没有初始值,那么编译器将会报错。那么构造函数都有哪些类呢?构造函数类型:有参构造函数、默认构造函数、类型转换构造函数、拷贝构造函数(深拷贝、浅拷贝在于是否new)。在初始化对象时将会调用相应的构造函数。相应的,在对象死亡时,析构函数将会被调用,目的是去做些善后的工作,比如说释放动态内存、对static进行操作等。
this指针:
this指针是个好东西。在类的非静态成员函数中有指向当前对象的this指针。例如:int fun( ){ return 0; } 将翻译成 int fun(const void* this){ return this-—>x; }。当a.fun()时,将会 this=&a;而在静态成员函数中没有this指针,因为它属于整个类,而不属于某个具体的对象。
运算符重载:
运算符重载是一个C++的重要功能。我们可以将运算符重载为成员函数、全局函数或友元函数。如果是重载类型转换,则不需要返回值,因为类型转换的时候你已经指明了返回值的类型。
继承派生与复合关系:
A—>B—>C—>D。对D来说,C是直接基类,A、B是间接基类。派生类是通过对基类进行修改(如果同名则进行覆盖)和扩充得到的。派生类定义后将不再依赖于基类,它拥有基类的全部成员函数和成员变量,但是派生类的成员函数不能访问基类的私有成员。在派生类对象中,包含基类对象,而且基类对象的存储位置位于派生类对象新增的成员变量之前。那么派生类的构造函数是怎样的呢?在构造对象时,先自动调用执行基类的构造函数,然后执行派生类的构造函数。析构函数的执行顺序是相反的。派生类的对象从某种程度上也是基类的对象,所以派生类的对象可以赋值给基类对象,派生类对象可以初始化基类引用,派生类对象的地址可以赋值给基类指针。复合关系就是类的组合关系。当然它的拷贝构造函数也是好写的。
虚函数及其实现机制:
有虚函数的类就有一个虚表