笔记(面向对象)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_39485740/article/details/101169606
1、面向对象的特点以及理解

1、封装:把一个抽象的结构封装成一个类(数据类型),使用该数据类型实例出一个对象,设置对象的属性,调用对象的方法来解决问题。
2、继承:如果一个类只能解决部分问题,我们可以把这个类继承下来,然后进行扩展已达到解决问题的方法。
3、多态:一个类的多种形态。对象会根据实例化的类做出不同的形态。

2、重载、覆盖、隐藏

1、重载:在同一作用域下,几个同名的函数,参数列表也不同(参数的类型,顺序,个数不同),则这几个函数构成重载的关系,与返回值无关。编译器会根据函数的参数调用一个最符合的函数。
2、覆盖:子类中的函数它的函数名、参数列表(参数的类型,顺序,个数)与父类的函数完全一致,且子类函数的返回值类型可以隐式转换成父类的函数的返回值类型。父类中的函数必须为虚函数,则构成覆盖关系。const的有无也会影响
3、影藏:父子类之间的同名函数,且能通过编译,如果没有构成覆盖关系,则构成了隐藏的关系。

3、虚函数的优缺点

优点:可以形成多态
缺点:
1、很消耗内存,每产生一个类则会形成一个虚函数表,每实例化一个对象的时候都会生成一个虚函数指针vptr用来指向虚函数表。
2、降低了执行速率,需要寻找到函数的地址再执行
3、可能会破坏封装的安全,通过虚函数指针vptr来绕过private限制。(如果把虚函数设置为private的,则说明无法在类外调用该函数,但是虚函数无论是private还是public的都存放在一张虚函数表上,都可以通过虚函数指针来访问调用)

4、为什么有虚析构函数没有虚构造函数。

没有虚构造的原因
1、如果构造函数为虚函数,则说明构造函数在虚函数表里,需要通过vptr来访问调用,但是类还没有实例化,vptr没有初始化,无法查找虚函数表,则无法调用虚构造函数。
2、没有意义,虚函数的意义在于通过使用子类的指针来调用父类的方法。然而构造函数时在创建对象的时候自动调用的,不需要通过子类的指针或引用来调用。
3、虚函数是在部分信息下完成的机制,他允许我们知道接口而不知道对象的类型,然而调用构造函数必须知道对象的类型。
有虚析构的原因
1、在多态的情况下,释放一个父类的指针,这时候调用的是父类的析构函数,如果子类中存在需要释放的内存就会无法释放,从而造成内存泄漏的问题。这时候就需要将父类的析构函数设置为虚函数。

5、为什么要使用模板

1、C/C++是静态编译语言(与别的语言不同,用var就可以声明不同类型的变量),虽然编译速度快,但是实现通用方法麻烦。
2、是为了实现泛型编程,减少代码量,增减函数的重用性。
3、它与#define不同,他会在编译的时候检查数据类型,从而保证类型安全。
4、具有较强的可移植性,并且可用于基本的数据类型。

猜你喜欢

转载自blog.csdn.net/qq_39485740/article/details/101169606
今日推荐