C++经典面试题
持续收集中...
1 基础(9)
1)C++中有malloc/free,为什么还需要new/delete?
new/delete会调用构造/析构函数,适合于类类型对象的创建与销毁。
2)C++中explicit关键字的作用?
关闭函数的类型自动转换(防止隐式转换)。
3)C++中static关键字的作用?
++i(前置加加)先自增1再返回,i++(后置加加)先返回i再⾃增1。
前置加加不会产生临时对象,后置加加必须产生临时对象,临时对象会导致效率降低。
1 int& int::operator++ (){ 2 *this +=1; 3 return *this; 4 }
i++实现:
1 const int int::operator(int) { 2 int oldValue = *this; 3 ++(*this); 4 return oldValue; 5 }
不是,两个不同类型的指针之间可以强制转换(reinterpret_cast)。
2 面向对象(15)
1)C++空类默认有哪些成员函数?
默认构造函数、析构函数、复制构造函数、赋值函数。
2)重载(overload)和重写(override)的区别
重载:在相同作用域中存在多个同名的函数,这些函数的参数表不同;
重写:派生类重新定义基类虚函数。
3)main函数执行之前会执行什么?
全局对象的构造函数。
4)有哪几种情况初始化方式只能用initialization list而不能用assignment?
当类中含有const、reference成员变量;基类的构造函数。
5)举例说明函数返回值采用引用传递的作用。
函数返回值采用引用传递的场合并不多,一般只出现在类的赋值函数中,目的是为了实现链式表达。例如:
1 class A { 2 A& operator = (const A& other); // 赋值函数 3 }; 4 A a, b, c; 5 a = b = c; // 合法 6 (a = b) = c; // 非法
6)为什么拷贝构造函数必需是引用传递,不能是值传递?
7)析构函数⼀般写成虚函数的原因?
8)面向过程与面向对象的区别?
面向过程:分析出解决问题所需要的步骤,然后用函数依次实现这些步骤,使用的时候依次调用;性能比面向对象高,但维护成本高。
面向对象:将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据;借助于封装、继承、多态性等特性,后期维护成本更低,更方便复用和扩展,但性能较差。
new operator实际上先后调用了operator new和constrctor两个函数。
10)重写函数的访问修饰符是可以不同的,例如尽管virtual中是private的,派⽣类中重写可以改为public。
11)空类是否占用内存空间?占用多少?
空类占用内存空间:1字节
12)构造函数调用顺序?
1)C++的四种强制转换?
1) vector与deque的区别?
1)deque访问容器元素的效率比vector容器慢很多;
原因在于deque要跨内存块来访问,而vector只是使用一个内存块,不用跨内存的操作。vector容器相当于一个可以动态分配的数组。
2)扩充容器容量的方面deque比vector的效率高很多;
deque是申请一个小的内存块,然后把新申请的内存块与其它的deque内存块整合起来。
vector是申请一个比原先更大的新内存块,把原vector里面的数据复制到新的大内存块里面,然后销毁原先的内存块。所以,在容量扩充方面,deque比vector高效,而且内存利用率也高。
3)vector不可以收缩,deque自动收缩;
vector不支持把容器的容量调小的操作,即容量需求小于实际容量的情况不会有任何操作。而deque因为它是有很多小内存块的组成的,所以有空闲的内存块时,会销毁空闲的内存块,但不会影响deque里面已有的数据。
2) vector方法push_back与emplace_back的区别?
push_back()向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而emplace_back()在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。
3) 有指针为什么还要迭代器(STL迭代器的作用)?
迭代器把不同集合类的访问逻辑抽象出来,使得不用暴露集合内部的结构也可以达到循环遍历集合的效果。
迭代器不是指针,是类模板,只是表现的像指针。它只是模拟了指针的⼀些功能,通过重载指针的⼀些操作符,如->、*、++、--等。迭代器封装了指针,是⼀个“可遍历STL(Standard Template Library)容器内全部或部分元素”的对象,本质是封装了原⽣指针,是指针概念的⼀种提升(lift),提供了⽐指针更高级的⾏为,相当于⼀种智能指针,他可以根据不同类型的数据结构来实现不同的++,--等操作。迭代器返回的是对象引⽤⽽不是对象的值,所以std::cout只能输出迭代器使⽤*取值后的值而不能直接输出其自身。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通