• C++面试题


    1.sizeof和strlen的区别
    1).sizeof是一个操作符,strlen是库函数
    2).sizeof的参数可以是数据的类型,也可以是变量,而strlen计算的只能是字符串的长度
    3)编译时就可以计算出sizeof的结果,strlen必须在运行是计算机出来,并且sizeof计算的是数据类型站的数据类型的大小,而strlen计算的是字符串实际的长度
    4).数组做sizeof计算的时候不退化,做strlen退化为指针
    
    2.typedef和define的区别
    1).typedef是C语言语句,其功能是用户为已有数据类型取“别名”
    2).用typedef定义数组、指针、结构等类型将带来很大的方便,不仅使程序书写简单而且使意义更为明确,因而增强了可读性。
    3).#define是C中定义的语法,typedef是C++中定义的语法,二者在C++中可以通用,但#define成了预编译指令,typedef当成语句处理。Typedef和#define都可以用来给对象取一个别名,但是两者却有着很大不同。
    区别
    1).二者执行时间不同:
        关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。#define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。
    2)功能不同
        Typedef用来定义类型的别名,这些类型不只包含内部类型(int,char等),还包括自定义类型(如struct),可以起到使类型易于记忆的功能
        #define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
    3).作用域不同
        #define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。而typedef有自己的作用域。
    
    3.extern
    extern标识的变量或者函数声明其定义在别的文件中,提示编译器遇到此变量和函数时在其它模块中寻找其定义。
    
    4.指针常量和常量指针
    1).指针常量(指针本身是常量)
        a.它是个常量!
        b.指针所保存的地址可以改变,然而指针所指向的值却不可以改变;
        c.指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
    2).常量指针(被指向的对象是常量)
        a.常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改;
        b.常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值;
        c.指针还可以指向别处,因为指针本身只是个变量,可以指向任意地址;   
    
    5.C++源文件从文本到可执行文件经历的过程
    预处理->编译->优化->汇编->链接
    
    6.new和malloc的区别
    1).属性
        new/delete是C++关键字,需要编译器支持
        malloc是C关键字,需要头文件支持
    2).参数
        new操作符申请内存时无需指明内存块的大小,编译器会根据类型信息自行计算
        malloc需要显式的告诉所需要的内存的大小
    3).返回类型
        new返回对象类型的指针类型严格与对象匹配无需类型转换,符合类型安全性的操作
        malloc内存分配成功返回void *,需要通过强制类型转换
    4).分配失败
        new分配失败返回异常,malloc分配失败会返回NULLL
    5).自定义类型
         new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)
         malloc/free是库函数,只能动态的申请和释放内存
    6).重载
        new支持重载,malloc不支持
    7).内存区域
        new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。
    
    7.野指针
    野指针,也就是指向不可用内存区域的指针。如果对野指针进行操作,将会使程序发生不可预知的错误,甚至可能直接引起崩溃。
    原因:
    1).指针没有初始化
    2).指针指向的内存被释放了,指针本身没有置NULL
    3).指针超过了变量的作用范围
    
    8.深拷贝和浅拷贝
    浅拷贝:只是拷贝了基本类型的数据,而引类型数据,复制后也是会发生引用,浅拷贝只是指向被复制的内存地址,如果原来对象呗修改,那么浅拷贝出来的对象也会被修改。
    深拷贝:在计算机中开辟一块新内存用于存放复制的对象。因此要用new或者malloc等。
  • 相关阅读:
    LSB最低有效位和MSB最高有效位
    STM32(十二)通过I2C总线向EEPROM总线中读写数据的过程
    EEPROM和Flash的区别
    Prometheus监控系统的从无到有
    shell 提取第一个指定参数前面的内容
    myBase7试用到期 破解步骤
    docker入门(六)端口映射于容器关联
    docker入门(五)docker数据管理
    针对ansible的一次调研
    docker入门(四)访问docker仓库
  • 原文地址:https://www.cnblogs.com/wlxtuacm/p/10623895.html
Copyright © 2020-2023  润新知