-
请用简单的语言告诉我 C++ 是什么?
C++ 是在 C 语言的基础上开发的一种面向对象编程语言,应用广泛。C++ 支持多种编程范式:面向对象编程、泛型编程和过程化编程。其应用领域广泛,常用于系统开发,引擎开发等应用领域,是最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性!
-
C 和 C++ 的区别?
C++ 在 C 的基础上增深类,C 是一个结构化语言,它的重点在于算法和数据结构。C 程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出或实现过程(事务)控制,而对于 C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程 (事务) 控制。
-
什么是面向对象?
面向对象是一种对现实世界理解和抽象的方法、思想,通过将需求要索转化为对象进行问题处理的一种思想。
-
什么是多态?
多态是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态。
-
设计模式懂嘛,简单举个例子?
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结比如单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点适用于:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时;当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。 比如工厂模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。适用于:当一个类不知道它所必须创建的对象的类的时候,当一个类希望由它的子类来指定它所创建的对象的时候,当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
-
STL 库用过吗? 常见的 STL 容器有哪些? 算法用过哪几个?
STL 包括两部分内容: 容器和算法。 (重要的还有融合这二者的迭代器)容器,即存放数据的地方。比如 array 等。 在 STL 中,容器分为两类: 序列式容器和关联式容器席列式容器,其中的元系不一定有序,但都可以被排序。如: vector、list、deque、stack、queue、heap、priority queue、slist:关联式容器,内部结构基本上是一颗平衡二叉树、所谓关联,指每个元案都有一个键值和一个实值,元案按照一定的规则存放。如: RB-tree、Setmap、 multiset、 multimap、 hashtable, hash set、 hash map, hash multiset hash multimap.下面各选取一个作为说明。 vector:它是一个动态分配存储空间的容器。区别于 C++ 中的 array,array 分配的空间是静态的,分配之后不能被改变,而 vector 会自动重分配(扩展) 空间。 set:其内部元案会根据元案的键值自动被排序。区别于 map,它的键值就是实值,而 map 可以同时拥有不同的键值和实值.算法,如排序,复制.....以及个容器特定的算法。这点不用过多介绍,主要看下面迭代器的内容。法代器是 STL的精睛,我们这样描述它:代器提供了一种方法,使它能够按照顺序访问某个容器所含的各个元素,但无需暴露该容器的内部结构它将容器和算法分开,好让这二者独立设计。
-
const 知道吗? 解释其作用
- const 修饰类的成员变量,表示成员常量,不能被修改
- const 修饰函数承诺在本函数内部不会修改类内的数据成员,不会调用其它非 const 成员函数
- 如果 const 构成函数重载,const 对象只能调用 const 函数,非 const 对象优先调用非 const 函数
- const 函数只能调用 const 函数。非 const 函数可以调用 const 函数5.类体外定义的 const 成员函数,在定义和声明处都需要 const 修饰符
-
堆和栈的区别? 堆和栈的生命周期?
堆栈空间分配区别:
- 栈(操作系统): 由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈:2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收,分配方式倒是类似于链表。
- 堆栈缓存方式区别:
- 栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放;
- 堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一日成为现儿对象就能被回收》。所以调用这些对象的演度要相对来得低一些。
- 堆栈数据结构区别:
- 堆《数据结构): 堆可以被看成是一棵树,如: 堆排序
- 栈(数据结构) : 一种先进后出的数据结构。
-
指针和引用的区别?
- 指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用仅是个别名:
- 引用使用时无需解引用(),指针需要解引用;
- 引用只能在定义时被初始化一次,之后不可变;指针可变;
- 引用没有 const,指针有 const;
- 引用不能为空,指针可以为空;
- "sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof 指针"得到的是指针本身的大小;
- 指针和引用的自增(++) 运算意义不一样;
- 指针可以有多级,但是引用只能是一级 (int **p;合法而int &&a 是不合法的)
- 从内存分配上看: 程序为指针变量分配内存区域,而引用不需要分配内存区域.
-
什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法? 你通常采用哪些方法来避免和减少这类错误?
- 用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元即为内存泄露。使用的时候要记得指针的长度
- malloc 的时候得确定在那里 free
- 对指针赋值的时候应该注意被赋值指针需要不需要释放
- 动态分配内存的指针最好不要再次赋值
-
常用的排序算法有哪些? 简单描述几个排序算法的优缺点?
选择、冒泡、快速、希尔、归并、堆排等.
- 快排:是冒泡排序的一种改进。 优点:快,数据移动少 缺点:稳定性不足
- 归并:分治法排序,稳定的排序算法,一般用于对总体无序,但局部有序的数列. 优点: 效率高 O(n),稳定 缺点:比较占用内存
-
new 和 malloc 的区别?
- malloc 与free 是 C++/C 语言的标准库函数,new/delete 是 C++ 的运算符。它们都可用于申请动态内存和释放内存。
- 对于非内部数据类型的对象而言,光用 malochree 无法满足动态对象的要求,对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
- 由于 malochree 是库函数而不是运算符,不在追译器控制权限之内,不能够把执行构造函数和析构及数的任务强加于 maloc/ree。因此C+语言需要一个能完成动态内存分配和初始化工作的运算符 new,以一个能完成清理与释放内存工作的运算符 delete注意 new/delete 不是库函数。
- C++ 程序经常要调用 C 函数,而 C 程序只能用 malloc/free 管理动态内存。
- new 可以认为是 malloc 加构造函数的执行。new 出来的指是直接带类型信息的。而 malloc 返回的都是 void 指针
-
TCP 和 UDP 通信的差别? 什么是 IOCP?
- TCP 面向连接, UDP 面向无连接的
- TCP 有保障的,UDP 传输无保障的
- TCP 是效率低的,UDP 效率高的
- TCP 是基于流的,UDP 某于数据报文
- TCP 传输重要数据,UDP 传输不重要的数据 IOCP 全称 I/O Completion Port,中文译为 I/O 完成端口 IOCP 是一个异步 I/O 的 API,它可以高效地将 I/O 事件通知给应用程序与使用 select 或是其它异步方法不同的是,一个套接字 socket 与一个完成端口关联了起来,然后就可继续进行正常的 Winsock 操作了。然而当一个事件发生的时候,此完成端口就将被操作系统加入一个队列中。然后应用程序可以对核心层进行查询以得到此完成端口。
-
解释 C++ 中静态函数和静态变量?
- 类静态数据成员在编译时创建并初始化:在该类的任何对象建立之前就存在,不属于任何对象,而非静态类成员变量则是属于对象所有的。类静态数据成员只有一个拷贝,为所有此类的对象所共享。
- 类静态成员函数属于整个类,不属于某个对象,由该类所有对象共享
- static 成员变量实现了同类对象间信息共享。
- static 成员类外存储,求类大小,并不包含在内。
- static 成员是命名空间属于类的全局变量,存储在 data 区的 rw 段
- static 成员只能类外初始化。
- 可以通过类名访问 (无对象生成时亦可) ,也可以通过对象访问.
-
说下你对内存的了解?
1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS 回收3。全局区,静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放 4.另外还有一个专门放常量的地方。- 程序结束释放 5.程序代码区,存放二进制代码。 在函数体中定义的变量通常是在栈上,用 malloc,calloc,realloc 等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static 修饰符后不管在明里都存放在全局区(静态区),在所有函数体外定义的 static 变量表示在该文件中有效,不能 extern 到别的文件用,在数体内定义的 static 表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。