美文网首页
笔试题目1

笔试题目1

作者: 飞猪的浪漫 | 来源:发表于2021-09-01 00:17 被阅读0次

    shared_ptr是一种智能指针,记录有多少个shared_ptrs共同指向一个对象,即引用计数。shared_ptr不能管理循环引用的对象,如果使用不当的话,会引起内存泄漏。(为了解决这个问题引入了弱指针 weak_ptr)

    构造和析构相反进行,可以想象成构造从内到外构造(父类到子类),析构从外到内拆除(子类到父类)

    父类先构造,然后子类构造,结束时,子类先析构,然后父类最后析构

    某一基类有构造函数A(),析构函数~A(),其派生类B的构造函数析构函数分别为B(),~B()

    开始时,先调用A(),再调用B(),结束时,先调用~B(),再调用~A()

    各类函数中:构造函数、析构函数、拷贝初始化构造函数等是类的成员函数。

    C语言系统中,如果int型数据占2个字节,则说明该系统是16位的系统,

    此时double型数据占8个字节,long型数据占4个字节,unsigned int占2个字节,char

    型数据占1个字节。

    若要以写方式打开当前目录下文件abc:txt:::fopen("abc.txt","w");

    假定一个类的构造函数为B(int x,int y){a=x--;b=x*y--;}。则执行B(3,5);语句后,a和b的值分别是

    (3和10)

    若有 int *p=(int *)malloc(sizeof(int));则向内存申请到内存空间存入整数123的语句为:

    p 是 int 的指针类型,scanf 要求 %d 相应参数也是 int 的指针类型 scanf("%d",p);

    scanf("%d",&p); &p 又取了一次 p 的地址,相当于指针的指针, scanf 尝试写入原本是指针的地址,导致 p 的值被改变(本应写入 p 指向的内存),后续解引用 *p 可能导致访问非法内存 产生运行时读内存错误。

    scanf("%d",*p);  *p 解引用取值,是一个未初始化的乱值, scanf 会把该值当作地址,可能导致运行时写内存错误或写入不被期望的内存区域。

    scanf("%d",**p); p 只是一次指针, **p 会编译错误。

    如果cur强制被转化成字符类型的指针,那么加2,就是加2个字符的大小,即为c,如果cur是对象指针,那么加2的话,就指向第3个object类型的对象。

    *(char*)((char *)(cur)+2),cur被强制转化为char*类型,然后+2,那么就是加两个字节,就是c。外面那个(char*)是为了转换为字符型指针与%c对应,本题可以不要,因为本来就是字符。

    *(char*)(cur+2)),cur的类型是object*,那么cur+2就是加两个obect的大小,就是6,因此是g。同样,外面那个(char*)是为了转换为字符型指针与%c对应,本题可以不要,因为本来就是字符。

    struct sk{ int a; float b; } data, *p=&data;

    如果是指针指向结构体,就用   ->  (“形状像个箭头,表示指向,记为指针访问结构体成员的方式”)

    结构体类型名访问结构体成员变量 用  .    成员访问运算符 

    综上可以用 :   p-> a    或者   (*p).a   

    char s[10];s="abcdefg";

    s表示字符串首地址,所以不能被赋值iiiiiiiiiiiiiii

    %*4s表示读取一个长度为四个字符的字符串,中间的*表示将读取到的字符串忽略,不赋给变量列表中的变量。

    scanf("%2d%*4s%2d", &x, &y);

    将输入的前两位给x,跳过中间的四个字符,将之后的两位给y。所以x=12,y=78.

    *赋值禁止字符,跳过输入字段,不进行赋值;

    %2d:2表示指定最大字段宽度,对输入数据按格式对2位整数作赋值;

    字符"23456"不作赋值,故:x=12,y=78;

    第一个 i++, ++i.

    1.1 - i++,指的是先使用然后再增加,比如: int i = 1; int i_pp = i++: // i_pp = 1;

    1.2 - ++i, 指的是先加然后再使用,比如:int i = 1; int pp_i = ++i; //pp_i = 2;

    这两点清楚后,就会知道

    switch(k> -i++)  等同于switch(k> -1) //k = 0,所以statement为true即为1。 

    第二个,switch case。

    当switch case没有break的时候,将会按照代码行数一一执行下去。

    通过第一点,得到了switch(1),所以进入case 1,由于没有break,再进入case0,但是,i,已经在switch statement的时候更新了 ,也就是说这个时候的,i,已经是2了。

    类成员默认为private的,struct成员默认为public.

    类A1、A2和A3中的成员函数show1、show2和 show3都是public(公开的),因此,各个类都可以通过对象调用该成员函数,即选项A、B和C;又因为这个属于类的多继承关系,即A1(基类)-->A2--->A3,由于A3继承A2的继承方式是protected(受保护的),所以类A1中的show1函数在派生类A3中是 protected,因此,不能通过类A3的对象访问 类A1中的 show1,故D选项错。

    include <file>  //在标准库及默认搜索目录中寻找将要 include 的文件 ;

    include "file" //先在当前目录中搜索文件,然后再到默认搜索目录中搜寻。

    shape *s1=&r;

    shape &s2=r; 是对的。

    class shape 

    {public:  

     virtual intarea()=0;

    };  

    shape为抽象类,不可实例化

    若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数f

    //在f函数定义的后面,其它的函数也是可以调用f函数的

    若在主函数前对函数f进行说明,则在主函数和其后的其它函数中都可以正确调用函数f

    //正确

    对于以上程序,编译时系统会提示出错信息:提示对f函数重复说明

    //在C语言中变量或函数可以重复声明,但是不能重复定义

    函数f无返回值,所以可用void将其类型定义为无值型

    //正确

    C++的容器有两种类型的容器:顺序容器和关联容器。

    顺序容器:又称线性容器,将数据组织成有限线性集合,主要有:vector、list、deque等。

    vector(向量)表示一段连续的内存地址,基于数组的实现,可以动态的增加或减少

    list(链表)表示非连续的内存,基于链表实现。

    deque(双端队列)与vector类似,但是对于首元素提供删除和插入的双向支持。

    关联容器:主要有map和set(底层是红黑树–平衡排序二叉树)

    map的元素是以key-value形式存在的,key是键值(键值不能重复),value是实值(可以重复),并以key值进行元素排序,查找

    set的元素是单值(键值与实值相同)的,是唯一的,其以实值排序、查找元素。

    multimap和multiset: 可以存放多个相同的key值。

    STL各种容器和算法的sort和find函数对重载运算符的调用情况:

    1、二叉树类型的容器的std::sort和std::find时都会调用operator < 。

    2、线性类型(vector、list)容器std::sort算法时会调用operator <;使用std::find算法会调用operator ==。

    线性容器(以vector为例)的重载运算符" < " 和" == "

    二叉树类型的容器的sort和find都会调用operator &lt;

    线性类型容器sort会调用operator &lt;

    线性类型容器使用std::find会调用operator ==.

    对于类与结构体等自定义类型数据的容器对象,重载运算符operator < 与operator ==有两种形式:一种是在类或结构体中直接以成员函数的形式定义;另一种就是在类外定义一个比较函数compare(),以函数指针(或函数对象)的形式作为函数参数传入(针对sort()排序函数)

    相关文章

      网友评论

          本文标题:笔试题目1

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