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等。
posted @ 2019-03-29 21:09  adfae  阅读(142)  评论(0编辑  收藏  举报