• 2019/08/20斗鱼C++后台开发笔试题


    1.int  *a[10] 类型为指针数组,int (*a)[10]类型为数组指针

    2.定义指向int sum(int a,int b);的函数指针 int  (*f)(int,int);f=sum;,该函数指针类型的大小为10的数组为 int (*f[10])(int ,int);

              扩展:    指向该函数指针类型数组的指针为  int (*(*f[10]) )(int ,int);

    3.输出为12,11,4,4

    void fun(char str[10]){
    	printf("%d
    ", sizeof(str));
    }
    int main(){
    	char str[] = "hello world";
    	printf("%d
    ", sizeof(str));
    	printf("%d
    ", strlen(str));
    	char*p = str;
    	printf("%d
    ", sizeof(p));
    	fun(str);
    	return 0;
    }
    

    4.Parent虚表存储的是Parent::fun1,Parent::fun2,Child1虚表存储的是Child1::fun1,Parent::fun2,Child2虚表存的是Child2::fun1,Child2::fun2

    class Parent{
    public:
        virtual void fun1();
        virtual void fun2();
        void fun3();
    };
    class Child1:public Parent{
    public:
        void fun1();
        void fun3();
    };
    class Child2 :public Child1{
    public:
        void fun1();
        void fun2();
        void fun3();
    };

    5.析构函数必须为虚函数吗,为什么

      不是,析构函数声明为虚函数是在用基类指针指向该子类对象时,释放基类指针时可以释放掉子类的空间,防止内存泄漏。

    6.哪几种情况下不能在类的构造函数中初始化,只能在初始化列表中进行初始化

      const类型成员变量,引用类型成员变量,类成员为没有默认构造函数的类类型,如果类存在继承关系,派生类必须在其初始化列表中调用基类的构造函数

    7.windows中lib文件和dll文件区别?生成DLL有两种模式,MT类型和MD类型的区别?使用时要注意的问题

      lib与dll区别

        (1)lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。
         (2)如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的

          ,索引和实现都在其中。使用静态编译的lib文件,在运行程序时不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时

          要发布新的应用程序才行。

        (3)动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文

          件链接到DLL文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。DLL和LIB文件必须随

          应用程序一起发行,否则应用程序会产生错误

      MT和MD区别

        (1)MD,表示运行时库由操作系统提供一个DLL,程序里不集成。程序就不需要静态链接运行时库,可以减小软件的大小,所有的模块都采用/MD,使用的是同一

          个堆,不存在A堆申请,B堆释放的问题;但用户机器可能缺少我们编译时使用的动态运行时库。

        (2)MT,表示运行时库由程序集成,程序不再需要操作系统提供运行时库DLL。有些系统可能没有程序所需要版本的运行时库,程序必须把运行时库静态链接上,

          减少模块对外界的依赖

      要注意的问题

        (1)选择MT需要解决的堆空间释放问题,不同的模块各自有一份C运行时库代码、或者根本没有C运行时库,导致了各个模块会有各自的堆。如果在A堆中申请空间

          ,到B堆中释放就会有崩溃,在模块A申请的空间,必须在模块A中释放。

        (2)选择MD需要注意多个模块使用不同版本运行时库的问题,多个dll被一个exe LoadLibrary加载,如果这些dll使用的运行时库是不同的,那么可能出现加载失

          败,原因可能是旧版本的运行时库已经在了,而某个dll它需要的是新版本的运行时库,旧版本不符合要求。

    8.简述windows消息循环机制

      当用户有操作(鼠标,键盘等)时,系统会将这些操作转化为消息,放在系统消息队列中。每个打开的进程系统都为其维护了一个消息队列,系统会将这些消息拷贝到对应

      进程的消息队列中,而应用程序会循环从消息队列中取出来消息,完成对应的操作

    9.Peekmessage和Getmessage的区别

      GetMessage:从系统获取消息,将消息从系统中移除,属于阻塞函数。当系统无消息时,GetMessage会等待下一条消息。

      PeekMesssge:以查看的方式从系统中获取消息,可以不将消息从系统中移除,是非阻塞函数;当系统无消息时,返回FALSE,继续执行后续代码

    10.线程同步的同步对象有哪些,他们之间有什么区别

      临界区、互斥量、信号量、事件;临界区只能同一进程中线程使用,不能跨进程使用,事件,互斥量,信号量都是内核

      对象,都可以跨进程使用;临界区和互斥量都只允许一个进程访问共享资源;信号量允许多个线程同时使用共享资源;

      事件机制,则允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。

    11.编程题:矩阵乘法。给定每个矩阵的行和列及乘的顺序,输出乘法的次数。第一个矩阵为A,第二个矩阵为B,以此类推

    示例:
    输入描述:
    3
    50 10
    10 20
    20 5
    (A(BC))
    输出描述:
    3500
    #include<bits/stdc++.h>
    #include<iostream>
    #include<vector>
    using namespace std;
    int main(){
        int n;
        while (cin >> n){
            vector<vector<int>>data(n, vector<int>(2));
            for (int i = 0; i < n; i++)
                cin >> data[i][0] >> data[i][1];
            string str;
            while (cin >> str){
                vector<vector<int>>s;
                int res = 0;
                for (int i = 0; i < str.size(); i++){
                    if (str[i] == ')'){
                        while (s.back()[0] != 0){
                            int r = s.back()[1];
                            int mid = s.back()[0];
                            s.pop_back();
                            int l = s.back()[0];
                            s.pop_back();
                            res += l*mid*r;
                            vector<int>t(2);
                            t[0] = l;
                            t[1] = r;
                            if (s.back()[0] == 0){
                                s.pop_back();
                                s.push_back(t);
                                break;
                            }
                            s.push_back(t);
                        }
                    }
                    else if (str[i] == '('){
                        vector<int>t(2,0);
                        s.push_back(t);
                    }
                    else{
                        vector<int>t(2);
                        t[0] = data[str[i] - 'A'][0];
                        t[1] = data[str[i] - 'A'][1];
                        s.push_back(t);
                    }
                }
                cout << res << endl;
            }
        }
    
        return 0;
    }
  • 相关阅读:
    ext数据库读取动态添加window组件
    sony e系列笔记本的OFFICE的序列号
    ext panel 移除item失效的解决办法
    ExtJS xtype class对照表
    Dynamic Form interacting with an embedded Grid
    extjs动态列--editorGridPanel(2.2)
    Ext.form.DisplayField扩展组件:在formpanel中显示html格式的内容
    ExtJS 动态增加与删除items,动态设置textField可见与否
    Extjs formPanel 显示图片 + 上传
    EXTJS的数据存储机制
  • 原文地址:https://www.cnblogs.com/youayou/p/11386115.html
Copyright © 2020-2023  润新知