• c++语言--面试题


    1.c++和c有什么不同?

    语言本身:c是c++的一个子集,c++在c的基础上增加了 类 和 模板 类型

    一方面:c++加强了c的过程化功能,引入了 重载和异常处理等

    另一方面:扩展了面向对象设计的内容  如:类,友元,继承,虚函数,模板

    编程角度:c是一中结构化编程语言  重点在于算法和数据结构

                   c++是面向对象的编程语言  重点在于如何设计对象模型

    2.const和volatile的作用

    const关键字作用于修饰普通变量和指针变量, 

    如果修饰变量名,则该变量变成常变量,不能被修改 

    如果修饰指针变量 const在c和c++中略有不同 

    在c中,c的编译器并不会把const修饰的变量当成常量,会为其分配内存空间,c编译器不知道它在编译器时的值(c++可以)

     volatile关键字 含义:"易变的"

    告诉编译器volatile变量随时可能发生变化的,与volatile变量有关的运算不要进行编译优化,每次使用它必须从volatile变量地址读取

    何为编译优化?

    1. int main()
    2. {
    3. volatile int a = 10;
    4. int i = a;
    5. /*
    6. 其他代码
    7. */
    8. int j = a;
    9. return 0;
    10. }

    如果没有volatile  编译器发现两次从a的地址读数据的代码之间没有对a进行过操作,它会自动将上次a的值放到中, 

     给出几个使用volatile关键字的示例

    1)多线程中被几个任务共享的变量

    2)中断服务子程序会访问到的非自动变量

    c++的显示类型转换

     1.静态转换(static_cast)

    static_cast用于明确定义的转换,包括"安全"转换(int---long)和不安全转换(long---int会导致信息丢失)但知道定义的转换,使用void*强转转换隐式类型转换

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. int i=0x11223344;
    6. long j;
    7. double k;
    8. //非强制安全转换 隐式转换
    9. j=i;
    10. k=i;
    11. //也可以 突出转换行为
    12. j=static_cast<long>(i);
    13. k=static_cast<double>(i);
    14. //非安全转换---导致信息丢失
    15. // i=j //丢失数字
    16. // i=k //丢失信息
    17. i=static_cast<int>(j); //表示我知道 消除警报
    18. i=static_cast<int>(k); //
    19. //
    20. void *vp=&i;
    21. //旧时风格可能产生危险的转换
    22. float* fp=(float*)vp;
    23. //新方式
    24. fp=static_cast<float*>(vp);
    25. return 0;
    26. }

    2.常量转换(const_cast)

    从const转换为非const或者从volatile转换为非volatile可以使用const_cast

    3.重解释转换(reinterpret_cast)

     4.动态转换(dynamic_cast)

    用于类继承结构中实现类型安全的对象指针向下转换

    内存管理

    •  代码段:用来存放程序的可执行代码,(可共享和只读的)
    • 数据段:包括未初始化区:存放未初始化(外部变量和静态局部变量)数据
    •                    静态数据区:已初始化的全局变量和静态局部变量和常量
    • 堆空间:用于存放程序执行动态分配的内存段
    • 栈空间:存放程序的临时局部变量和函数参数和返回地址

     malloc/free和new/delete的不同?

    malloc/free是c语言的标准库函数

    new/delete是c++中运算符

    new运算符会自动调用对象的构造函数  delete会自动调用对象的析构函数

    在c++中支持malloc/free 为什莫还需要new/delete?

    因为malloc/free不满足为对象动态分配内存空间的要求,

    对象在创建是要自动调用构造函数 销毁时要自动执行析构函数

    malloc/free是库函数不是运算符所以不在编译器的控制权限之内,不能把执行构造函数和析构函数交给malloc/free

    对于内置类型malloc/free和new/delete是等价的,为什么不把malloc/free淘汰掉?

    因为c++经常要调用c函数,而纯c只能用malloc/free管理内存

    函数传递方式?

    • 传值
    • 传引用
    • 传地址

    函数采用引用传递的优点?

    • 用引用传递函数的参数能保证参数传递不产生临时变量,提高传递效率,节省空间
    • 引用参数定义为const 不能修改形参值,保证引用传递的安全性

      当引用作为函数返回值时遵守以下规则?

    1. 不要返回局部变量, 局部变量返回时会被销毁,

    2.  不要返回malloc/new分配的内存引用,  函数返回的引用只是作为一个临时变量出现,没有被赋予一个实际变量,那么这个引用所指的空间就无法释放,造成内存泄露.

  • 相关阅读:
    【matlab】智能优化算法优化BP神经网络
    Windows11+VS2019驱动开发环境搭建
    涨知识,关于代码签名证书10大常见问题解答
    keepalived高可用学习 keepalived+nginx高可用负载均衡配置
    基于粒子群优化的支持向量机房价预测分析
    Redis5 持久化
    中国制霸生成器「GitHub 热点速览 v.22.42」
    Vue - 标准开发方式、组件(全局、局部、props、事件传递)、插槽的使用
    通过xsd校验xml
    Mysql如何理解Sql语句?MySql分析器
  • 原文地址:https://blog.csdn.net/weixin_58389786/article/details/126485164