美文网首页
C++笔试整理

C++笔试整理

作者: 诸子墨墨 | 来源:发表于2018-04-03 22:01 被阅读0次

    1、new 、delete 、malloc 、free 的关系
    malloc 与 free 是 C++/C 语言的标准库函数, new/delete 是 C++ 的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于 malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free 。因此 C++ 语言需要一个能完成动态内存分配和初始化工作的运算符 new ,以及一个能完成清理与释放内存工作的运算符 delete 。注意 new/delete 不是库函数。

    总结:
    new和delete会自动调用对象的构造与析构函数而malloc与free不会;
    new和delete是C++运算符,而malloc和free是C/C++标准库函数。

    2、delete 与 delete [] 区别
    delete 只会调用一次析构函数,而 delete[] 会调用每一个成员的析构函数。在 More Effective C++ 中有更为详细的解释:“当 delete 操作符用于数组时,它为每个数组元素调用析构函数,然后调用 operatordelete 来释放内存。” delete 与 New 配套, delete [] 与 new [] 配套

    MemTest*mTest1=newMemTest[10];

    MemTest*mTest2=newMemTest;

    int*pInt1=newint[10];

    int*pInt2=newint;

    delete[]pInt1; //1

    delete[]pInt2; //2

    delete[]mTest1;//3

    delete[]mTest2;//4

    在 4处报错。

    这就说明:对于内建简单数据类型, delete 和 delete[] 功能是相同的。对于自定义的复杂数据类型, delete 和 delete[] 不能互用。 delete[] 删除一个数组, delete 删除一个指针简单来说,用 new 分配的内存用 delete 删除用 new[] 分配的内存用 delete[] 删除 delete[] 会调用数组元素的析构函数。内部数据类型没有析构函数,所以问题不大。如果你在用 delete 时没用括号, delete 就会认为指向的是单个对象,否则,它就会认为指向的是一个数组。

    总结: delete 只会调用一次析构函数,而 delete[] 会调用每一个成员的析构函数。

    3、继承优缺点
    类继承是在编译时刻静态定义的,且可直接使用,类继承可以较方便地改变父类的实现。但是类继承也有一些不足之处。首先,因为继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现。更糟的是,父类通常至少定义了子类的部分行为,父类的任何改变都可能影响子类的行为。如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。

    4、子类构造和析构
    子类被构造的时候回先调用父类的构造函数
    子类析构的时候先析构子类后析构父类
    如果直接用子类构造一个父类的对象,删除这个父类的对象不会调用子类的析构函数(父类的析构函数为虚函数除外)

    5、#define DOUBLE(x) x+x , i = 5*DOUBLE(5) ; i 是多少?

    答案: i 为 30 。

    所以在define里面的变量最好使用(),防止出现错误。

    6、描述内存分配方式以及它们的区别 ?
    1 ) 从静态存储区域分配 。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如 全局变量, static 变量 。
    2 ) 在栈上创建 。在执行函数时, 函数内局部变量的存储单元都可以在栈上创建 ,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。
    3 ) 从堆上分配 , 亦称动态内存分配 。程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。

    7、struct 和 class 的区别

    答案: struct 的成员默认是公有的,而类的成员默认是私有的。 struct 和 class 在其他方面是功能相当的。从感情上讲,大多数的开发者感到类和结构有很大的差别。感觉上结构仅仅象一堆缺乏封装和功能的开放的内存位,而类就象活的并且可靠的社会成员,它有智能服务,有牢固的封装屏障和一个良好定义的接口。既然大多数人都这么认为,那么只有在你的类有很少的方法并且有公有数据(这种事情在良好设计的系统中是存在的 ! )时,你也许应该使用 struct 关键字,否则,你应该使用 class 关键字。

    8、当一个类 A 中没有任何成员变量与成员函数 , 这时 sizeof(A) 的值是多少?如果不是零,请解释一下编译器为什么没有让它为零。

    肯定不是零。举个反例,如果是零的话,声明一个 class A[10] 对象数组,而每一个对象占用的空间是零,这时就没办法区分 A[0],A[1] …了。

    9、分别写出 BOOL,int,float, 指针类型的变量 a 与“零”的比较语句

    BOOL : if ( !a ) or if(a)
    int : if ( a == 0)
    float : const EXPRESSION EXP = 0.000001
    if ( a < EXP && a >-EXP)
    pointer : if ( a != NULL) or if(a == NULL)

    10、请说出 const 与 #define 相比,有何优点?

    Const 作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被 Const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

    1 ) const 常量有数据类型,而宏常量没有数据类型 。编译器可以对前者进行类型 安全检查 。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
    2 ) 有些集成化的调试工具可以对 const 常量进行调试 ,但是不能对宏常量进行调试。

    11、链表相关的题目

    相关文章

      网友评论

          本文标题:C++笔试整理

          本文链接:https://www.haomeiwen.com/subject/gothhftx.html