• **公司实习生笔试总结


    一、

    昨天去参加一个实习生笔试,确实是高大上的公司,出的题目有点水平;比较坑的就在于,当我被C++虐了一番之后,他们跟我讲平时不常用C++,%>_<%

    看一道题目吧:

    #include <stdio.h>
    
    int main()
    {
    	unsigned int a = 0x123456a8; //原来给的例子是0xFFFFFFF7,这个例子迷惑性比较大,本例中强调a这个字节对结果的影响
    	unsigned char b = (unsigned char)a; // 字节截断操作
    	//char d = (char)a;
    
    	char *c = (char*)&a; // 改变的是指针的寻址方式
    
    	// C语言中的一个特性,char类型参数不能直接入栈,要类型提升为int型才可以;因为0xa8的符号位是1,所以提升为0xffffffa8
    	printf("b = %08x	*c = %x
    ",b,*c); 
    	return 0;
    }

    当时,我只是给面试官解释了(1)对小端机器的理解:低有效位在低地址,高有效位在高地址,简称高高低低;(2)对字符截断的理解,长类型转为短类型,从低地址开始留下段类型长度的部分;但是这里考察的第三点,也就是C语言中参数默认类型提升,我没有接触过,所以当时也没能回答上来,不过好像面试官并不太在意这个,他比较满意的,应该是我按部就班分析问题,回答自己所知道的全部这种感觉吧。

    从这个问题,我学到的是,在C语言中,一定要注意类型转换,如果要用,就用“显式的强制类型转换”。

    参考:

    1. printf参数类型提升
    2. C printf() 详解
    3. 弱类型?C语言参数提升带来的陷阱
    4. CSDN上一个不错的讨论帖
    二、
    题目考查的是unsigned 和 signed相加时,会将signed转换为unsigned Int再相加;即“哪个能表示更大的数就转为哪个类型
    #include <stdio.h>
    
    void func(unsigned int a)
    {
    	int b = -20;
    	printf("(unsigned int)b = %u
    ",(unsigned int)b); // <span style="font-family: Arial, Helvetica, sans-serif;">4294967276 , 因为|b| + (unsigned int)b = 2^32,所以(unsigned int) b = 2^32 - |b|</span>
    
    	int m = a + b;
    	printf("%d
    ",m);
    	printf("%u
    ",a+b);
    
    	if (a + b > 0)
    		printf(">0
    ");
    	else if (a + b < 0)
    		printf("<0
    ");
    	else
    		printf("=0
    ");
    }
    
    int main()
    {
    	func(20); // 4294967276 + 20 = 4294967276,按照无符号数算,无符号32位最大值为2^32-1,即4294967275,这里循环回绕到0
    	func(18); // 
    	func(21);
    	return 0;
    }

    结果是:
    =0
    >0
    >0
    参考:
    1. CSDN里面有价值的讨论帖
    三、考察C++ 中,当成员变量中含有动态申请的内存空间时,必须重新编制拷贝构造函数和赋值操作符重载~
    有问题的代码是:
    #include <iostream>
    using namespace std;
    
    class CA
    {
    private:
    	int *p;
    public:
    	CA()
    	{
    		p = new int;
    	}
    };
    
    
    CA func(CA c)
    {
    	CA a;
    	a = c; //引发内存悬挂,原来a.p指向的那片内存,成为没有指针指向的内存
    	
    	return a;
    }
    
    int main()
    {
    	CA c;
    	func(c);
    	return 0;
    }

    修改过后的代码应该是:
    #include <iostream>
    using namespace std;
    
    class CA
    {
    private:
    	int *p;
    public:
    	CA()
    	{
    		p = new int;
    	}
    	//拷贝构造函数
    	CA(const CA&);
    	//赋值操作符重载
    	CA& operator=(const CA &example);
    };
    
    //拷贝构造函数的实现
    CA::CA(const CA& example)
    {
    	cout << "拷贝构造函数" <<endl;
    	p = new int;
    	*p = *example.p;
    }
    
    //赋值操作符重载的定义
    CA& CA::operator=(const CA &example)
    {
    	int *temp = new int;
    	*temp = *example.p; //复制指针指向的内容
    	delete p; //释放原指针指向的内存空间
    	p = temp; //建立新的指向
    	return *this;
    }
    
    
    CA func(CA c)
    {
    	CA a;
    	a = c; //引发内存悬挂,原来a.p指向的那片内存,成为没有指针指向的内存
    	
    	return a;
    }
    
    int main()
    {
    	CA c;
    	CA d = func(c);
    	return 0;
    }

    参考:据说在《Effective C++》中条款11讲到这个知识点,要这么说的话,还得把这本书拿来看看了~~~;另外参考这个帖子写的代码:拷贝构造函数和赋值运算符重载

    四、C++实现单例模式
    当时的考题给出四个选项,让你选择一个能够实现单例模式的代码,我没有全部记住;
    现在参考这个网站给的例子:http://sourcemaking.com/design_patterns/singleton/cpp/1
    #include <iostream>
    using namespace std;
    
    class GlobalClass
    {
    private:
        int m_value;
        static GlobalClass *s_instance; // key1:定义一个静态变量
        GlobalClass(int v = 0) //key2:构造函数要私有
        {
            m_value = v;
        }
    
    public:
        int get_value()
        {
            return m_value;
        }
        void set_value(int v)
        {
            m_value = v;
        }
    
    	// key4:静态成员函数,初始化静态成员变量s_instance
        static GlobalClass *instance() 
        {
            if (!s_instance)
              s_instance = new GlobalClass;
            return s_instance;
        }
    };
    
    // key3: 静态成员变量的初始化,在类的外部,类似于成员函数的定义
    // Allocating and initializing GlobalClass's
    // static data member.  The pointer is being
    // allocated - not the object inself.
    GlobalClass *GlobalClass::s_instance = NULL;
    
    void foo(void)
    {
    	GlobalClass::instance()->set_value(1);
    	cout << "foo: global_ptr is " << GlobalClass::instance()->get_value() << '
    ';
    }
    
    void bar(void)
    {
    	GlobalClass::instance()->set_value(2);
    	cout << "bar: global_ptr is " << GlobalClass::instance()->get_value() << '
    ';
    }
    
    int main()
    {
    	cout << "main: global_ptr is " << GlobalClass::instance()->get_value() << '
    ';
    	foo();
    	bar();
    
    	return 0;
    }

    五、考擦C++的继承、初始化列表,基类构造函数和子类构造函数的初始化顺序。凭映像,记得代码是如下:
    #include <iostream>
    using namespace std;
    
    class CA
    {
    private:
    	int numa;
    public:
    	CA():numa(0){}
    	CA(int a):numa(a){cout << "基类构造函数" << endl;}
    	~CA(){cout << "基类析构函数" <<endl;}
    };
    
    
    class CB: public CA
    {
    private:
    	int numb;
    public:
    	CB(int a,int b):CA(a),numb(b){ cout << "子类构造函数" <<endl;}
    	~CB(){cout << "子类析构函数"<<endl;}
    };
    
    
    
    int main()
    {
    	CB b(3,4);
    	return 0;
    }

    六、shell编程的基本知识
    问题1:如何运行一个监控进程,将日志打印到不同的文件,正常日志输出到log.txt,错误日志输出到error.txt

    ./A  1 > log.txt 2 > error.txt

    基本知识还需要看本简单的书,复习一下,面试的时候不会问太难;但是基本的概念要掌握,也不要不懂装懂乱说

    七、python相关的问题

    问题1:python的模块导入原理
    问题2:gdb--->pdb的使用,比方说条件断点的设置?
    问题3:python中是否有类方法?

  • 相关阅读:
    Infopath Notify 弹出提示信息
    window.showModalDialog 返回值
    【转】获得正文内容中的所有img标签的图片路径
    Json Datable Convert
    Sharepoint 列表 附件 小功能
    Surgey 权限更改
    SQL 触发器用于IP记录转换
    Caml语句 查询分配给当前用户及当前组
    jquery 1.3.2 auto referenced when new web application in VSTS2010(DEV10)
    TFS diff/merge configuration
  • 原文地址:https://www.cnblogs.com/javaadu/p/11742638.html
Copyright © 2020-2023  润新知