计算机视觉/图像处理相关面经3

均从网上搜集而来,非本人面经,这里做简单整理,这里侧重于C++

new/malloc区别

1.new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持。
2.使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算,面向对象。而malloc则需要显式地指出所需内存的尺寸,面向内存。
3.new 可以重载,malloc不能重载
4.malloc内存分配成功则是返回void ,需要通过强制类型转换将void指针转换成我们需要的类型;new操作符内存分配成功时,返回的是对象类型的指针

虚拟继承

虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。

面向对象特性

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承,是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
多态,是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

多态

多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
虚函数:定义为virtual后,编译器将记住这个信息,所以在后边的show()函数中,并不知道display的明确指向,即编译器不知道此时的函数入口是CBuilding 的display()还是CBridge的display()。直到在main()中运行到相应的实例时,才知道具体指向哪一个的display()。这也就是所谓的滞后捆绑技术。
虚函数实际上是利用滞后捆绑处理来实现多态的,因此执行效率低一些,但其实现的多态性相当诱人。所以提倡,成员函数设计成虚函数。
抽象类只能派生新类,自身不能实例化。抽象类的特点是:它的成员函数中至少有一个是纯虚函数,由于纯虚函数没有函数体,因而抽象类不能被实例化,这是在编译层面被限制的。只要有一个成员函数是纯虚函数,这个类就是抽象类,抽象类派生新类后,其子类中一定要对纯虚函数进行覆盖,即重写该方法。
重载分为:函数重载和运算符重载,二者本质一样。

GCC编译过程

1.预处理,生成预编译文件(.文件)
2.编译,生成汇编代码(.s文件)
3.汇编,生成目标文件(.o文件)
4.链接,生成可执行文件

C++四种类型转换

const_cast , static_cast , dynamic_cast , reinterpret_cast
详细的以后补

重载和重写

重写:也叫做覆盖,一般发生在子类和父类继承关系之间。子类重新定义父类中有相同名称和参数的虚函数。(override)
重载:函数名相同,函数的参数个数、参数类型或参数顺序三者中必须至少有一种不同。函数返回值的类型可以相同,也可以不相同。发生在一个类内部。

栈存储和堆存储

栈区(stack):又编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈。
堆区(heap):一般是由程序员分配释放,若程序员不释放的话,程序结束时可能由OS回收,值得注意的是他与数据结构的堆是两回事,分配方式倒是类似于数据结构的链表。

stack由系统自动分配,系统收回;heap需要程序员自己申请,C中用函数malloc分配空间,用free释放,C++用new分配,用delete释放。

栈:栈由系统自动分配,速度快,但是程序员无法控制。
堆:堆是有程序员自己分配,速度较慢,容易产生碎片,不过用起来方便。

栈:在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令的地址,然后是函数的各个参数,在大多数的C编译器中,参数是从右往左入栈的,当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令。
堆:一般是在堆得头部用一个字节存放堆得大小,具体内容由程序员安排

指针和引用的区别

指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。
可以有const指针,但是没有const引用
指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化
指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了
用指针传递参数,可以实现对实参进行改变的目的,是因为传递过来的是实参的地址;引用作为函数参数进行传递时,实质上传递的是实参本身,即传递进来的不是实参的一个拷贝,因此对形参的修改其实是对实参的修改

C++ static作用

static对象如果出现在类中,那么该对象即使从未被使用到,它也会被构造以及析构。而函数中的static对象,如果该函数从未被调用,这个对象也就绝不会诞生,但是在函数每次被调用时检查对象是否需要诞生。
什么时候用static:需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。
static的优势:可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。

STL底层实现

https://blog.csdn.net/single_wolf_wolf/article/details/52854015

0%