day13

发布时间 2023-09-09 23:53:54作者: skural

C++面试题

1.说一下常见的linux指令

ls:查看当前文件目录

cd:切换当前目录

rm:删除文件或者文件夹

cp:复制文件或者文件夹

cat:查看文件内容

touch:创建一个新文件

pwd:显示当前工作目录

2.请你说说delete和free的区别?
1.delete是运算符,free是库函数

2.delete在使用时会调用对象的析构函数,而free不会调用

3.delete用于释放new分配的空间,而free用于释放malloc分配的空间

4.调用free之前要检查被释放的指针是否为NULL,而delete不用

3.简述一下c++中的重载和重写?
重载:重载是函数名相同,函数中形参的个数、类型不同

重写:重写是派生类中的函数对基类中的虚函数进行重新定义

重载:重载就是不同的函数使用相同的函数名,但是函数中的形参的个数或者形参个数不同,调用的时候根据不同的形参来调用不同的函数,并且函数的重载根返回值没有关系。  并且重载用来实现静态多态
重写:重写就是派生类对基类中的虚函数重新实现。也就是函数名跟形参相同,只是函数的实现方式不同,重写用来实现动态多态。

 

4.简述一下面向对象的三大特征

面向对象的三大特征是封装,继承,和多态。封装就是隐藏函数内部实现的细节,只保留接口,这样用户在使用的时候,只需要调用不同的接口就可以,而不必知道函数内部实现的细节;继承,就是不同的类之间存在这样一种继承的关系,也就是子类可以继承父类的成员变量和成员函数;多态分为静态多态和动态多态,像重载就是静态多态,在编译时就确定了对象的状态,动态多态如函数的重写,子类通过对父类中的虚函数进行重写,可以实现不同的功能。

 面向对象的三大特征就是封装、继承和多态。 封装就是将数据和操作数据的方法进行结合,隐藏对象的属性和实现细节,仅仅是公开对外的接口来和对象进行交互 继承,c++最重要的一个特征就是代码的重用性,通过继承机制,可以通过旧的数据类型来定义新的数据类型,新的类不仅拥有旧类的数据成员,而且还有属于自己的新的数据成员 多态是指通过基类的指针和引用,在运行时动态调用实际对象函数的行为。多态是在运行时根据基类的指针或者引用指向的对象来确定自己具体该调用哪一个类的虚函数,当父类指针指向父类对象时,就调用父类的虚函数;当父类指针指向子类对象时,就调用子类的虚函数 

 

5.简述一下浅拷贝和深拷贝?
浅拷贝,将原对象的引用直接赋给新对象,新对象只是原对象的一个引用

深拷贝,创建一个新对象,将源对象的元素赋值给元对象,重新分配一个内存空间来存储原对象的元素

浅拷贝:浅拷贝又被称为值拷贝,把原对象的值拷贝到新对象当中去,如果元对象当中有指针并且在堆区中分配内存,使用浅拷贝的时候拷贝的是这个指针变量的数值,也就是说新对象和元对象指向的时同一块地址空间。

深拷贝,在拷贝的时候,会先开辟和原对象大小一致的内存空间,然后将元对象的数据拷贝到新对象当中去,这样元对象和新对象指向的是不同的内存空间,但是他们内部的内容是一致的,

 

6.简述一下c++中的多态?

c++中的多态指的是通过基类的指针或者引用,在运行时动态调用实际绑定对象函数的行为,多态分为动态多态和静态多态。静态多态指的是,在编译期间就确定该调用哪个函数,静态多态有函数的重载,运算符重载,泛型编程等;动态多态指的是在运行时,根据基类的指针或者引用,指向的对象来动态的决定该调用哪一个函数的行为,当父类指针指向父类对象时,就调用父类的虚函数;当父类指针指向子类对象时,就调用子类的虚函数 。

动态多态实现的原理,当类中声明一个虚函数时,编译器会在类中声明一个虚函数表,虚函数表会存储虚函数指针,虚函数表是由编译器自动生成和维护的,当存在虚函数时,每个对象都会存在一个指向虚函数表的指针,在多态调用时,这个指针就会根据这个对象在对应类的虚函数表中查找对应的函数,从而 调用这个函数。

 

7.简述一下虚函数的实现原理?
虚函数的作用主要就是实现动态多态,动态多态就是父类类型的指针指向子类的对象,然后通过父类的指针调用子类的成员函数,父类的指针也就有了多种形态,;

虚函数的实现原理,主要是通过虚函数表来实现的,当编译器处理虚函数时,会自动生成一个虚函数表,虚函数表中存储的是虚函数的地址,如果派生重写了父类的虚函数,那么派生类中的虚函数表中存储的就是派生类的虚函数地址,如果派生类没有重写基类的虚函数,那么派生类中存储的就是基类的虚函数地址,

 

8.什么是纯虚函数,有什么作用?

纯虚函数就是基类中的虚函数不能给出有意义的实现式,就可以把虚函数声明为纯虚函数,纯虚函数没有函数体,并且==0,纯虚函数的实现留给派生类去做,一个类中如果有纯虚函数,那么这个类就不能实例化对象,也被称作抽象类,

 

9.虚析构函数有什么作用?
虚析构函数主要是为了预防内存泄漏,将基类的析构函数声明为虚析构函数,如果没有声明为虚析构函数时,那么当基类的指针指向子类对象的时候,基类指针释放的时候就不会调用子类的析构函数,而是去调用父类的析构函数,这样的话,子类占用的内存空间就不会被释放掉,从而会造成内存泄漏

 

10.请你说说重载、复写、隐藏的区别?
重载:同一作用域下,函数名相同,函数的形参类型跟个数不相同,与返回值无关

复写:也就是重写,不同作用域下,函数名相同,实现不同

隐藏:不同作用域的同名函数构成隐藏