• C++常用面试题20231022


    C与C++的区别

    c++在c的基础上增添类,C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。

    问3:什么是面向对象(OOP)?

    答:面向对象是一种对现实世界理解和抽象的方法、思想,通过将需求要素转化为对象进行问题处理的一种思想。

    1. 对象:在面向对象编程中,对象是程序的基本构建单元。在图书馆系统中,我们可以创建对象来代表图书、借阅者和图书馆自身。

    2. :类是对象的蓝图或模板。每个类定义了对象的属性(成员变量)和方法(成员函数)。例如,我们可以创建一个名为Book的类来定义图书对象,包括书名、作者、出版日期等属性,以及借书和还书等方法。

    3. 封装:封装是将数据和操作数据的方法捆绑在一起的概念。在图书馆系统中,我们可以将图书对象的属性和方法封装在Book类中,以确保数据的安全性和可维护性。

    4. 继承:继承允许一个类(子类)继承另一个类(父类)的属性和方法。例如,我们可以创建一个名为LibraryMember的子类,它继承了一般Person类的属性,同时具有一些特有的属性和方法。

    5. 多态:多态是一种机制,允许不同类的对象对相同的消息作出不同的响应。在图书馆系统中,不同类型的对象(例如BookLibraryMember)可以响应不同的操作,如借书或还书。

    1. #include
    2. #include
    3. class Book {
    4. public:
    5. Book(const std::string& title, const std::string& author, int year)
    6. : title_(title), author_(author), year_(year) {}
    7. void Borrow() {
    8. // 实现借书逻辑
    9. std::cout << "Book borrowed: " << title_ << std::endl;
    10. }
    11. void Return() {
    12. // 实现还书逻辑
    13. std::cout << "Book returned: " << title_ << std::endl;
    14. }
    15. private:
    16. std::string title_;
    17. std::string author_;
    18. int year_;
    19. };
    20. class LibraryMember {
    21. public:
    22. LibraryMember(const std::string& name, int memberId)
    23. : name_(name), member_id_(memberId) {}
    24. void BorrowBook(Book& book) {
    25. // 实现借书逻辑
    26. book.Borrow();
    27. }
    28. void ReturnBook(Book& book) {
    29. // 实现还书逻辑
    30. book.Return();
    31. }
    32. private:
    33. std::string name_;
    34. int member_id_;
    35. };
    36. int main() {
    37. Book book("The Catcher in the Rye", "J.D. Salinger", 1951);
    38. LibraryMember member("Alice", 1001);
    39. member.BorrowBook(book);
    40. member.ReturnBook(book);
    41. return 0;
    42. }

    问6:STL库用过吗?常见的STL容器有哪些?算法用过哪几个?

    答:

    STL包括两部分内容:容器和算法。(重要的还有融合这二者的迭代器)

    容器,即存放数据的地方。比如array等。

    在STL中,容器分为两类:序列式容器和关联式容器。

    序列式容器,其中的元素不一定有序,但都可以被排序。如:vector、list、deque、stack、queue、heap、priority_queue、slist;

    关联式容器,内部结构基本上是一颗平衡二叉树。所谓关联,指每个元素都有一个键值和一个实值,元素按照一定的规则存放。如:RB-tree、set、map、multiset、multimap、hashtable、hash_set、hash_map、hash_multiset、hash_multimap。

    下面各选取一个作为说明。

    vector:它是一个动态分配存储空间的容器。区别于c++中的array,array分配的空间是静态的,分配之后不能被改变,而vector会自动重分配(扩展)空间。

    set:其内部元素会根据元素的键值自动被排序。区别于map,它的键值就是实值,而map可以同时拥有不同的键值和实值。

    算法,如排序,复制……以及个容器特定的算法。这点不用过多介绍,主要看下面迭代器的内容。

    迭代器是STL的精髓,我们这样描述它:迭代器提供了一种方法,使它能够按照顺序访问某个容器所含的各个元素,但无需暴露该容器的内部结构。它将容器和算法分开,好让这二者独立设计。

    问7:数据结构会吗?项目开发过程中主要用到那些?

    答:数据结构中主要会用到数组,链表,树(较少),也会用到栈和队列的思想。

    问8:const知道吗?解释其作用。

    答:

    1.const 修饰类的成员变量,表示成员常量,不能被修改。

    2.const修饰函数承诺在本函数内部不会修改类内的数据成员,不会调用其它非 const 成员函数。

    3.如果 const 构成函数重载,const 对象只能调用 const 函数,非 const 对象优先调用非 const 函数。

    4.const 函数只能调用 const 函数。非 const 函数可以调用 const 函数。

    5.类体外定义的 const 成员函数,在定义和声明处都需要 const 修饰符

    问10:堆和栈的区别?堆和栈的生命周期?

    答:

    一、堆栈空间分配区别:

    1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;

    2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

    二、堆栈缓存方式区别:

    1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;

    2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

    三、堆栈数据结构区别:

    堆(数据结构):堆可以被看成是一棵树,如:堆排序;

    栈(数据结构):一种先进后出的数据结构。

    问11:解释下封装、继承和多态?

    答:

    一、封装:

    封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。

    封装的意义在于保护或者防止代码(数据)被我们无意中破坏。

    二、继承:

    继承主要实现重用代码,节省开发时间。

    子类可以继承父类的一些东西。

    三、多态

    多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

    问12:指针和引用的区别?

    答:

    1. 指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用仅是个别名;

    2. 引用使用时无需解引用(*),指针需要解引用;

    3. 引用只能在定义时被初始化一次,之后不可变;指针可变;

    4. 引用没有 const,指针有 const;

    5. 引用不能为空,指针可以为空;

    6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;

    7. 指针和引用的自增(++)运算意义不一样;

    8. 指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)

    9.从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。

    问13:什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?你通常采用哪些方法来避免和减少这类错误?

    答:用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元即为内存泄露。

    使用的时候要记得指针的长度。

    malloc的时候得确定在那里free.

    对指针赋值的时候应该注意被赋值指针需要不需要释放.

    动态分配内存的指针最好不要再次赋值.

    问15:new和malloc的区别?

    答:

    1、malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

    2、对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。

    3、由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

    4、C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

    5、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。

    问19:说下你对内存的了解?

    答:

    1.栈 - 由编译器自动分配释放

    2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收

    3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放

    4.另外还有一个专门放常量的地方。- 程序结束释放

    5 程序代码区,存放2进制代码。

    在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。

  • 相关阅读:
    使用Java 17中的record替代Lombok的部分功能
    论文笔记: 度量学习之 DML
    对Spring Bean的一些思考(对Bean的理解及命名问题)
    卷积神经网络CNN基础知识
    Matlab|模拟电动汽车的充放电【充电顺序,波动发电,电池缓冲】
    #机器学习--补充数学基础--概率论
    AP5125 DC-DC降压恒流IC SOT23-6 过认证 9-100V 6A电源驱动线路图
    java计算机毕业设计基于安卓的城市公交查询小程序 uniapp
    外传-Midjourney的局部重绘功能
    下载视频号安装,下载视频号安装到手机上?
  • 原文地址:https://blog.csdn.net/u013590327/article/details/133968716