• 【笔试题】【day9】


    目录

    第一题(构造函数和析构函数的) 

    第二题(重载运算符的相关问题)

    第三题(让某个类只能通过new来创建)

    第四题(静态成员变量的相关知识)

    第五题(模板函数的声明)


    第一题(构造函数和析构函数的) 

    1. ClassA *pclassa=new ClassA[5];
    2. delete pclassa;

    C++语言中,类ClassA的构造函数和析构函数的执行次数分别为()

    A 5,1
    B 1,1
    C 5,5
    D 1,5

    1.malloc/calloc/readlloc-->free

    2.new/delete

    3.new[]/delete[]

    一定要匹配使用,否则程序可能会产生内存泄漏,程序可能会崩溃

    如果是

    new T

    1.调用operator new(size)申请空间

            内部其实是用malloc循环申请

    2.调用T的构造函数对申请的空间进行初始化 

    delete p:

    1.调用析构函数释放p指向对象中的资源。

    2.调用operator delete释放p所指向的空间

            内部是调用free的

    所以这个new和delete其实是将这个malloc和free封装在里面了

    注意:new只能申请单个元素的空间,delelte只能释放单个元素的空间

    new T[N]

    1.调用operator new[](size)申请空间

            内部会调用operator new(size)

    2.调用N次T的构造函数

    delete[] p 

    1.调用N次析构函数释放p指向的N个对象

    2.调用operator delete[](p)

            内部调用的就是 operator delete(p)

    pclass从堆上new了5个对象,存放在一段连续的空间,也就是调用了5次构造函数

    然后delete pclass释放其实是有问题的,真正的释放其实是应该是delete[] pclass,释放这五个对象,这个delete pclass仅仅是释放一次,也就是仅仅是会将这五个对象其中的一个释放掉。也就是仅仅调用一次析构函数。

    但是程序运行期间可能会发生崩溃,如果有这个选项,就选择可能会崩溃这个选项

    第二题(重载运算符的相关问题)

    在重载一个运算符为成员函数时,其参数表中没有任何参数,这说明该运算符是 ( )。

    A 无操作数的运算符
    B 二元运算符
    C 前缀一元运算符
    D 后缀一元运算符

    首先,它一定是一元运算符,因为该运算符只需要一个参数。比方说++,--

    每个非静态的成员函数没有任何参数,但是它还有一个隐藏的this指针

    前置++的重载(++1)

            Date& operator++()

    后置++的重载(1++)

            Date operator++(int)

    为了让这两个函数形成函数重载,函数名一样,参数列表不同,所以我们的后置++在参数列表增加了一个int。

    因为我们这里没有任何参数,所以是前置++

    C

    第三题(让某个类只能通过new来创建)

    在C++中,为了让某个类只能通过new来创建(即如果直接创建对象,编译器将报错),应该()

    A 将构造函数设为私有
    B 将析构函数设为私有
    C 将构造函数和析构函数均设为私有
    D 没有办法能做到

    A类:假设A类的构造函数是私有的

    在类外:A* pa=new A();那就无法进行创建了。

    因为new原理:1.申请空间 2.调用构造函数对申请的空间进行初始化(私有的话就没办法进行调用构造函数进行初始化了)

    析构函数设置为私有的话,创建对象还是可以创建的,没有任何问题。在创建完成之后,如果想要对该对象进行销毁这个delete pa;就不可以了。

    delete:1.调用A类的析构函数(因为析构函数为私有,所以这一步无法完成了) 2.释放空间。

    但是我们可以给A类增加一个共有的方法,来释放空间

    void Release(A*&p)

    {

            delete p;

    }

    B

    第四题(静态成员变量的相关知识)

    下面有关c++静态数据成员,说法正确的是()

    A 不能在类内初始化
    B 不能被类的对象调用
    C 不能受private修饰符的作用
    D 可以直接用类名调用 

    静态成员变量:所有的对象共享的,并不属于具体的某个对象--在类中声明,然后再类外单独进行定义,不能在构造函数的初始化列表的位置初始化--在类外访问静态成员变量时:对象。静态成员变量||类名::静态成员变量

    A:如果是const类型的静态成员变量,比方说const static int a=10是可以在类内进行初始化的。但如果是static int b=20就不可以了!!

    带有类内初始化静态类型的成员变量,必须为常量!

    不是const类型就在类外进行初始化int A::b=20;

    C:都是会受到访问限定符的限制的

    第五题(模板函数的声明)

    下列的模板声明中,其中几个是正确的() 

    1)template
    2)template
    3)template
    4)template
    5)template
    6)template
    7)template
    8)

    A 2
    B 3
    C 4
    D 5

    下面两种都是可以的

    template

    template

    如果有多个,每一个前面都需要加上class

    template

    class和typename可以混着使用

    所以正确的是4,6,7,一共三个

  • 相关阅读:
    Springboot晋韵戏剧点播网站毕业设计源码112304
    代码随想录二刷 day04 | 链表之 24两两交换链表中的节点 19删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II
    变量使用volatile和不使用volatile的区别
    阿里云ACA证书有什么用?
    【LeetCode】Day126-正则表达式匹配
    JavaFX:控件边框设置
    关于软件物料清单(SBOM),你所需要了解的一切
    任务系统之Jenkins子任务
    nodejs的express负载均衡
    C#/VB.NET 替换 PDF 文件上的现有图像
  • 原文地址:https://blog.csdn.net/weixin_62684026/article/details/127436956