1.C和C++的区别
1)C是一种面向过程的语言,一种结构化语言,考虑如何通过过程处理输入以获得输出; C++是一种面向对象的语言,主要特点是“封装、继承和多态性”。 封装隐藏了实现细节,使代码模块化; 派生类可以继承父类的数据和方法,扩展现有模块,实现代码复用; 多态是“一个接口,多个实现”,通过派生类重写父类的虚函数来实现接口的复用。
2)C和C++动态管理内存的方法不同。 C 使用 /free,而 C++ 也有 new/ 关键字。
3)C++支持函数重载,但C不支持函数重载
4)C++中有引用,但C中不存在引用的概念
2.C++中指针和引用的区别
1)指针是一个新的变量,它存储了另一个变量的地址,我们可以通过访问这个地址来修改另一个变量;
引用只是一个别名,或者说是变量本身,对引用的任何操作都是对变量本身的操作,以达到修改变量的目的
2)引用只有一层,而指针可以有多层
3)当指针作为参数传递时,仍然是按值传递。 指针本身的值不能被修改。 需要取消引用才能对指向的对象进行操作
通过引用传递参数时,传入的是变量本身,因此可以修改变量
3. 结构体与社区联盟(union)的区别
结构:将不同类型的数据组合成一个整体,是自定义类型
社区:几个不同类型的变量一起占用一段内存
1)结构体中的每个成员都有自己独立的地址,并且它们同时存在;
社区中所有成员占用相同的内存,他们不能同时存在;
2)()是内存对齐后所有成员的长度之和,(union)是内存对齐后最长数据成员的长度,
为什么结构要内存对齐?
4.#和const的区别
1)#定义的常量没有类型,给出的是立即数; const 定义的常量有一个类型名并存储在静态区域中
2)加工阶段不同。 #定义的宏变量在预处理时被替换,并且可能存在多份。 const定义的变量是在编译时确定的,并且只有一份。
3)#定义的常量不能用指针指向,而const定义的常量可以用常量地址的指针指向
4) #可以定义简单函数,const不能定义函数
5.重载、重写、重写,三者的区别
1)、几个语义相似的函数用相同的名字来表示,但参数和返回值不同,这就是函数重载
特点:作用域相同(同一个类中),函数名相同,参数不同,关键字可选
2)、派生类重写基类的虚函数,实现接口的复用
特点:作用域不同(基类和派生类),函数名相同,参数相同,基类中必须有关键字(必须是虚函数)
3)、派生类屏蔽其基类同名函数
特点:不同的作用域(基类和派生类)、相同的函数名、不同的参数或相同的参数且没有关键字
6.new、、、free之间的关系
new/,/free都是动态分配内存的方式
1)严格指定打开空间的大小,而new只需要对象名
2)new为对象分配空间时,会调用该对象的构造函数,并调用该对象的析构函数
既然有了/free,为什么C++中还需要new/呢?
因为 /free 是库函数而不是运算符,所以不能将执行构造函数和析构函数的能力强加于 /free
7. 与[]的区别
析构函数只会被调用一次,而[]会调用每个成员的析构函数
用new分配的内存被释放,用new[]分配的内存用[]释放
8.您使用过STL库吗? 常见的STL容器有哪些? 你用过多少种算法?
STL由两部分组成:容器和算法
容器是存储数据的地方,比如数组,分为串行容器和关联容器两种
顺序容器,其中的元素不一定是有序的,但可以排序,如list、queue、stack、heap、-queue、slist
关联容器,内部结构是一棵平衡二叉树,每个元素都有一个键值和一个实值,如map、set、
算法包括排序、复制等,以及每个容器的具体算法
迭代器是STL的本质。 迭代器提供了一种方法,使其能够按顺序访问容器中包含的元素,而无需暴露容器的内部结构。 它将容器与算法分离,使两者独立设计。
9.你知道const吗?解释一下它的作用
const修饰类的成员变量意味着常量不能被修改
const修饰类的成员函数意味着该函数不会修改类中的数据成员,也不会调用其他非const成员函数
10. 虚拟功能是如何实现的?
每个包含虚函数的类都至少有一个对应的虚函数表,虚函数表中存储了该类的所有虚函数对应的函数指针(地址)。
类的示例对象不包含虚函数表,仅包含虚指针;
派生类生成与基类兼容的虚函数表。
11.堆和栈的区别
1)栈存放函数的参数值和局部变量,由编译器自动分配和释放
堆是new分配的内存块,由应用程序控制,需要程序员手动释放。 如果没有,操作系统会在程序结束后自动回收它。
2)由于堆分配需要使用频繁的new/,导致内存空间不连续,会出现大量碎片
3)堆的增长空间向上,地址较大,栈的增长空间向下,地址较小
12.关键词的作用
1)函数体:被修改的局部变量的作用域是函数体。 与auto变量不同的是,它的内存只分配一次,因此下次调用时它的值保持最后的值
2)模块内:修饰的全局变量或全局函数可以被模块内的所有函数访问,但不能被模块外的其他函数访问,使用范围仅限于声明它的模块内
3)在类中:修改成员变量,表示该变量属于整个类,并且该类的所有对象只有一份
4)类中:修改成员函数,表示该函数属于整个类,不接受this指针,只能访问类中的成员变量
注意和const的区别! ! ! const强调值不可修改,强调唯一副本,对于所有类的对象
13、STL(关联容器)中map和set的原理
Map和Set的底层实现主要是通过红黑树来实现
红黑树是一种特殊的二叉搜索树
1)每个节点要么是黑色,要么是红色
2)根节点为黑色
3)每个叶节点(NIL)都是黑色的。 【注:这里的叶子节点是指为空(NIL或NULL)的叶子节点! ]
4)如果一个节点是红色的,那么它的子节点必须是黑色的
5) 从一个节点到其后代的所有路径都包含相同数量的黑色节点。
特征4)和5)决定了没有一条路径会比其他路径长两倍,因此红黑树是一棵近乎平衡的二叉树。
14.##“file.h”的区别
前者是从标准库路径中找到的
后者来自当前的工作路径
15.什么是内存泄漏? 面对内存泄漏和指针越界,你有什么方法呢?
动态分配内存开辟的空间在使用后没有手动释放,导致内存一直被占用,这就是内存泄漏。
方法:/free要匹配。 分配指针时,要注意分配的指针是否需要释放; 使用时记住指针的长度,防止越界