C++面经之C++

  • 1.C和C++的区别
        • 在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”?
        • C语言怎么处理返回值
        • C++的类中哪些成员会被算入sizeof中
  • 2.C/C++较Java有性能优势,为什么?
  • 3.C++语言特性:构造函数,析构函数,虚函数,内联函数,静态成员函数,重载,覆盖,隐藏
        • Static_cast<>,dynamic_cast<>,const_cast<>,reinterpret_cast<>的各自作用和使用环境?
  • 4.面向对象的三个特性
        • C++中可以继承string类吗?为什么?
        • 封装,继承,多态。
        • 纯虚函数
        • 面向对象的五个原则:
    • 4.1.C++ 虚函数表解析
    • 4.2.c++虚函数实现机制及内存模型
    • 4.3.虚函数的调用过程?
        • 静态函数能定义为虚函数吗?为什么?
        • 静态函数能定义为常函数吗?为什么?
        • 静态数据成员定义(初始化)不应该被放到头文件中
        • 静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。
    • 4.4.深入理解C++的动态绑定和静态绑定
    • 4.5.介绍所有的构造函数,什么情况下要给类写拷贝构造函数
  • 5.C++的构造函数不可以为虚函数
  • 6.析构函数为什么要使用虚函数
        • 内联函数可以是虚函数吗?
  • 7.list、vector和deque的区别
        • STL空间配置器如何处理内存的?能说一下它的大概实现方案吗?为什么是8bytes的倍数?
  • 8.C++函数重定义、重载、重写的区别
  • 9.C++的 const总结
      • 指针和常量
  • 10.常对象的成员变量一定不可以修改吗?为什么?
  • 11.C++智能指针
        • 智能指针的设计和实现
  • 12.指针和引用的区别
  • 13.hashmap,原理?内存分配怎么分配的?
        • hash_map和map的区别在哪里?
        • 什么时候需要用hash_map,什么时候需要用map?
  • 14.有了malloc/free为何还要new/delete呢?
  • 15.全局变量和static变量的区别
  • 16.this指针
  • 17.STL sort的实现原理
  • 18.如何判断一个单链表是否有环?
  • 19.C++单链表和双向链表了解吗,说一下性能的比较
  • 20.教你如何迅速秒杀掉:99%的海量数据处理面试题
  • 21.哲学家进餐问题
  • 22.select,poll,epoll,I/O多路复用是怎么样的?
        • IO同步,异步,阻塞,非阻塞。
  • 23.平衡二叉排序树,失衡后怎么排序。
  • 24.设计模式
  • 25.红黑树
  • 26.数据库事务的特性
  • 27.快排的优化
        • 排序稳定的算法,你知道那些?
  • 28.HTTP1.0和HTTP1.1的区别
        • Http的报文结构
          • Http请求报文
          • Http响应报文
        • Http的状态码含义
        • Http request的几种类型
        • Http怎么处理长连接
        • Cookie与Session的作用与原理
  • 29.访问一个网页的过程,计算机发生了什么?
        • HTTP403表示什么?表示权限不够。
  • 30.死锁的原因?条件?如何预防?又如何避免?如何解除?
  • 31.volatile是干啥的
  • 32.new和malloc的区别
  • 33.指针数组和数组指针
  • 34.单例模式
  • 35.Socket编程
  • 36.C语言如何得到一个结构体内成员的偏移量?
  • 37.指针函数和函数指针和的区别
  • 38.单例模式
  • 39.重载运算符
  • 40.内存池
  • 41.线程池
  • 42.僵尸进程、孤儿进程
  • 43.同步、异步、阻塞、非阻塞
  • 44.查内存泄露
  • 45.malloc(0)会返回什么
  • 46.各种排序算法的时间复杂度空间复杂度,还有稳定性
  • 47.GDB 调试
  • 48.互斥锁和读写锁的区别

1.C和C++的区别

http://blog.csdn.net/zqixiao_09/article/details/51235444

区别:

C语言是一种结构化语言,面向过程,基于算法和数据结构,所考虑的是如何通过一个过程或者函数从输入得到输出;

C++是面向对象,基于类、对象和继承,所考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题,通过获取对象的状态信息得到输出或实现过程控制。

面向过程

优点:性能比面向对象高,因为类调用需要实例化,开销比较大,比较消耗资源,比如嵌入式开发,单片机开发等一般采用面向过程开发,性能是最重要的因素。

缺点:没有面向对象易维护、易复用、易扩展。

面向对象

优点:易维护、易扩展、易复用,由于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统,是系统更加灵活、更加易于维护。

缺点:性能比面向过程低。

在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”?

答:C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为: void foo(int x, int y);

该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。
C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。

C语言怎么处理返回值

返回值会被保存在cpu的寄存器中,因此,在返回子函数后,返回值能从寄存器中将返回值赋值给调用函数中的变量。

https://blog.csdn.net/HKaisa/article/details/51785481

C++的类中哪些成员会被算入sizeof中

1.非静态数据成员
2.还有要维护虚函数表的指针,占4字节。

解释:使用sizeof()计算类大小的一些基本原则:

  • 类的大小为类的非静态成员数据的类型大小之和,也就是说静态成员数据不作考虑;
  • 类的总大小也遵守类似class字节对齐的,调整规则;
  • 成员函数都是不会被计算的;
  • 如果是子类,那么父类中的成员也会被计算;
  • 虚函数由于要维护虚函数表,所以要占据一个指针大小,也就是4字节。
    总结:一个类中,虚函数、成员函数(包括静态与非静态)和静态数据成员都不占用类对象的存储空间。

2.C/C++较Java有性能优势,为什么?

https://zhidao.baidu.com/question/559368057.html

3.C++语言特性:构造函数,析构函数,虚函数,内联函数,静态成员函数,重载,覆盖,隐藏

http://blog.csdn.net/iamcxl369/article/details/7773010

Static_cast<>,dynamic_cast<>,const_cast<>,reinterpret_cast<>的各自作用和使用环境?

Static_cast:能完成大部分转换功能,但是并不确保安全

Const_cast:无法从根本上转变类型,如果是const,它就依旧是const,只是如果原对象不是const,可以通过此转换来处理,针对指针和引用而言。

Dynamic_cast:针对基类和派生类指针和引用转换,基类和派生类之间必须要继承关系,是安全的。

Reinterpret_cast:允许将任何指针类型转为其他指针类型,是安全的。



C风格转换是“万能的转换”,但需要程序员把握转换的安全性,编译器无能为力;

static_cast最接近于C风格转换,但在无关类指针转换时,编译器会报错,提升了安全性;

dynamic_cast要求转换类型必须是指针或引用,且在下行转换时要求基类是多态的,如果发现下行转换不安全,dynamic_cast返回一个null指针,dynamic_cast总是认为void*之间的转换是安全的;

reinterpret_cast可以对无关类指针进行转换,甚至可以直接将整型值转成指针,这种转换是底层的,有较强的平台依赖性,可移植性差;

const_cast可以将常量转成非常量,但不会破坏原常量的const属性,只是返回一个去掉const的变量

http://blog.csdn.net/chenlycly/article/details/38713981

4.面向对象的三个特性

http://blog.csdn.net/uestclr/article/details/51553978

C++中可以继承string类吗?为什么?

不可以,因为string不是类

封装,继承,多态。

封装

  • 该公开的就公开,该私有的就隐藏掉,主要是由Public,private实现;作用是便于分工和分模块,防止不必要的扩展。

继承

  • 就是一种传承,可以把父类型的数据传承到子类型中,子类除了传承父类的数据之外,还可以对父类型进行扩展。

    1. 公开继承public
    2. 保护继承protected
    3. 私有继承private
    4. 保护成员:在子类和本类中可以访问,其他不行;
    5. 构造函数和析构函数是不能被继承的,但是可以被调用。并且子类一定会调用父类的构造函数;
    6. 拷贝构造函数和赋值运算符函数也不能被继承:在子类不提供拷贝构造和赋值运算符时,子类默认调用父类的赋值运算符和拷贝构造函数。但子类一旦提供拷贝构造和赋值运算符函数则不再调用父类拷贝构造和赋值运算符函数。

多态

  • 多态:一个父类型的对象的指针或者引用指向或者是引用一个子类对象时,调用父类型中的虚函数,如果子类覆盖掉了虚函数,则调用的是子类覆盖之后的。
  • 继承是构成多态的基础;
  • 虚函数是构成多态的关键;
  • 函数覆盖是构成多态的必备条件;
  • 多态的应用:函数参数,函数返回值。


纯虚函数

纯虚函数的作用:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。作为接口而存在 纯虚函数不具备函数的功能,一般不能直接被调用。

从基类继承来的纯虚函数,在派生类中仍是虚函数。如果一个类中至少有一个纯虚函数,那么这个类被称为抽象类(abstract class)。

抽象类中不仅包括纯虚函数&#x

你可能感兴趣的:(面试)