目录
函数模板是不是函数?什么时候会变成真正的函数呢?可以解决什么问题?
-
一个空类有哪些函数?
不是一开始就有的 是创建对象后才会有的
默认构造函数、析构函数、拷贝构造函数、=赋值运算符、&运算符函数、&运算符函数 const
-
函数模板是不是函数?什么时候会变成真正的函数呢?可以解决什么问题?
1:不是函数,是模板,在内存中是不占空间的
2:就是在使用的时候把真正的数据类型传进去的时候,才会变成一个真正的函数!这个真正的函数是系统根据我们给的具体的类型自动帮我们生成!
变成真正的函数在内存中就占空间了!
3:解决函数重载存在的代码冗余的问题!
-
STL的组件有哪些? 6大组件
算法: 对容器中的数据进行操作
容器: 保存数据
迭代器:iterator 面向对象版本的指针,主要作用:访问容器中的数据
分配器
适配器
函数对象(仿函数)
-
重定义(隐藏)、重载、重写(覆盖)的区别?
重载:必须在同一个作用域内,函数名相同,参数不同与返回值类型无关的一组函数,
重定义:必须在继承关系中,子类重定义了父类的同名函数!子类的函数与父类的函数名字相同!
重写: 必须在继承关系中,子类重写父类的虚函数!要求是函数的首部必须是一模一样的!(函数类型 函数名(参数列表)必须一样!)
-
多态有几种?分别是什么?
2种 静态多态和动态多态也叫动态绑定和静态绑定
这两种多态有什么区别?
链接的时刻是不一样的
动态多态(动态绑定):
调用一个函数,在运行阶段才能知道执行哪一个函数体!体现在继承、虚函数中!
静态多态(静态绑定):
调用一个函数,在编译阶段就能知道执行哪一个函数体!体现在函数重载、运算符重载
-
实现动态多态的条件是什么:
- 必须有继承,一个父类,多个子类
- 父类中要有虚函数,子类要重写父类的虚函数
- 必须通过父类的引用或者是指针去操作子类对象,去调用虚函数的时候
-
有虚函数一定会触发多态吗?
不一定 必须同时满足桑条件 才会触发多态
-
动态多态存在的问题,如何去解决
创建子类对象 用父类指针去接受
问题:如果在子类的构造函数中使用new的方式动态去分配空间,那么就需要在子类的析构函数中使用delete去做释放,没有执行子类的析构函数,就会造成内存泄露
解决:是把父类的析构函数写成虚函数
为什么不执行子类的析构函数,就会造成内存泄漏
如果在子类的构造函数中使用new的方式动态去分配空间,那么就需要在子类的析构函数中使用 delete去做释放,没有执行子类的析构函数,就会造成内存泄露
为什么在设计类的时候,建议把父类的析构函数写成虚析构函数
通过父类的指针去释放子类的对象,只执行父类的析构函数,并不会执行子类的析构函数,这样就会造成内存泄漏。
-
宏函数与内联函数的区别:
<1>本质是不一样,内联函数是函数;宏函数是宏,并不是函数!
<2>传参:函数要什么类型的参数给什么类型的参数; 宏:不会进行类型检查,全部按文本的格式去处理!
内联函数是对C语言中宏函数的优化!