中间元旦划水了一段时间hh
二、C++浏览
3、基于对象的设计
信息隐藏一般不会带来额外的负担【C++提供了内联函数机制:在调用点被展开】,C++中类内的函数都是内联【隐式】。
关于内联函数详细内容,可以参考大佬的博客:【C++】 内联函数详解(搞清内联的本质及用法)_c++内联函数-CSDN博客
【个人理解:我们在调用函数时,有一个传参的过程,CPU必须要中断主程序的运行,先把实参、局部变量、地址压入栈中再执行调用函数的函数体的内容,结束调用时也要进行类似的操作,会消耗时间,内联函数的作用就是把函数体直接在主函数内展开,相当于把调用的函数体写到了主函数内,节省了传参这些时间。】
C++类的初始化【构造函数:函数名和类名相同】:构造函数专门用来初始化类,可以用【函数重载:参数表必须不同,函数名称相同】的方式自定义多种初始化的方式。
缺省构造函数:默认,不传参。
在类外定义类的成员函数:
IntArray::
IntArray( int sz )
{
// 设置数据成员
size = sz;
ia = new int[ _size ];
// 初始化内存
for ( int ix=0; ix < _size; ++ix )
ia[ ix ] = 0;
}
使用了域操作符::【告诉编译器,在哪里定义】
如果类在构造的时候很多初始化用了相同或者相似的代码,可以新建一个函数来完成这个工作,只要在构造函数里调用就行。
类的析构函数:~加上类名,也可以重载。作用是删除构造时分配的内存。
操作符重载【重新定义操作符的内容】。
Q1+Q2:C++ 类的关键特征是接口与实现的分离,接口是一些用户可以应用到类对象上的操作的集合。它由三部分构成:这些操作的名字、它们的返回值、以及它们的参数表。一般地,这些就是该类用户所需要知道的全部内容。私有实现包括为支持公有接口所必需的算法和数据 。理想情况下,即使类的接口增长了,它也不用变得与以前的版本不相兼容。另一方面,在类的生命周期内其实现可以自由演化。从下面选择一个类,并为该类编写一个公共接口。(a) Matrix (c) Person (e) Pointer(b) Boolean (d) Date (f) PointClass Person{ public: // private: // void iniP(int size,str *name); char *_name; int _sz; }; void Person::iniP(int size,str *name){ _sz = size; _name = new char[_sz]; for(int ix = 0;ix<_sz;ix++){ if(!name) _name[ix]=' '; else _name[ix] = name[ix]; } } Person::Person(int size,str *name){iniP(size,name);}
需要析构函数,因为使用了动态内存,需要释放。
4、面向对象的设计
类的继承【针对使用场景的变化,在基本功能上面增加专项的功能以应对变化】。
被继承的类叫做【基类】,从基类派生的类叫做【派生类】或者【子类】。
【个人理解】C++中的虚拟函数机制:【通过虚函数表实现】:C++实现虚函数的方式,就是在创建类的时候,会创建隐藏的类成员,每个隐藏成员会保存一个指向虚函数表的指针,指针指向了函数的地址,如果在继承时,没有重载父类的函数,那么这个指针指向的是父类函数的地址,如果重写了父类的函数,那么指向的是本类重写函数的地址,在表上原本记载了父类函数地址的位置被重写成子类的地址。如果继承了多个类,相当于虚函数表是个二维数组。
【基类设计中的两个思考点】1、C++的protected访问级别:只允许给派生类用,不提供给一般的程序。2、Virtual标记:【看派生类是不是要用不同的操作、类型】