北京嘉楠科技面试总结-创新互联

面试问题:

1.const在C/C++中的作用是什么?

创新互联专注于企业营销型网站建设、网站重做改版、永州网站定制设计、自适应品牌网站建设、H5网站设计商城网站建设、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为永州等各大城市提供网站开发制作服务。

2.malloc/free  new/delete 的区别是什么?

3.内联函数和宏定义不同

4.多态的实现

5.shell是用来干嘛的?

6.linux:给你一个名叫ABC的文件夹,如何对其进行压缩

7.linux:怎么查看当前线程信息

8.翻转链表

解答问题:

1.const在C/C++中的作用是什么?

在C语言中被const修饰的值是不可以进行改变的,因为const修饰的变量会存放在常量区,所以

在使用const变量之前必须先初始化。

如果const修饰的是指针,可以修饰指针指向的数据为const,或者指针本身为const,同时两者也可以同时声明。

在C++中,const修饰的类成员函数只能进行只读操作。在对函数声明时使用const进行声明,可以防止函数内部进行修改。

对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。

2.malloc/free  new/delete 的区别是什么?

相同点:

都是在堆上申请内存,且需要用户手动释放。

不同点:

malloc/free是函数。申请的空间不会初始化,且需要手动计算空间的大小并进行传递,当malloc返回的是void*需要进行强制转换。

内存申请失败是会返回NULL,需要进行判定是否为空。申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数。

new/delete是操作符。 申请的空间会自动初始化,不用计算空间大小,只需要在其后跟上空间的类型即可,new在内存申请失败时只需要进行异常捕获,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。

3.内联函数和宏定义不同?

内联函数(inline)在编译后展开,直接被嵌入到目标代码中去,可以进行诸如类型安全检查、语句是否正确等编译功能,不用担心因括号产生的二义性问题。inline函数一般用于比较小的,频繁调用的函数,这样可以减少函数调用带来的开销。

宏在预编译时展开,只是一个简单的文本替换,不可以进行诸如类型安全检查、语句是否正确等编译功能,需要注意因括号产生的二义性的问题。

引入inline的意义:inline有点类似于宏定义,但是它和宏定义不同的是,宏定义只是简单的文本替换,是在预编译阶段进行的。而inline的引入正是为了取消这种复杂的宏定义的。

4.多态的实现

静态多态:通过函数重载实现。

动态多态:通过继承重写基类的虚函数。 

5.shell是用来干嘛的?

shell是操作系统的最外层,shell可以合并编程语言以控制进程和文件,以及启动和控制其他程序。
简单来说:shell就是一个用户跟操作系统之间交互的命令解释器。

shell独立于内核,它是链接内核和应用程序的桥梁

6.linux:给你一个名叫ABC的文件夹,如何对其进行压缩?

tar -zcvf ABC.file

tar -zcvf 打包压缩后的文件名 要打包的文件 参数说明:z:调用gzip压缩命令进行压缩; c:打包文件; v:显示运行过程; f:指定文件名;

7.linux:怎么查看当前线程信息

其实linux没有线程,都是用进程模仿的

1. ps -ef f
用树形显示进程和线程,比如说我想找到proftp现在有多少个进程/线程,可以用

$ ps -ef f | grep proftpd
nobody 23117 1 0 Dec23 ? S 0:00 proftpd:  (accepting  connections) 
jack 23121 23117 0 Dec23 ? S 7:57 \_ proftpd: jack - ftpsrv:  IDLE
jack 28944 23117 0 Dec23 ? S 4:56 \_ proftpd: jack - ftpsrv:  IDLE

这样就可以看到proftpd这个进程下面挂了两个线程。
在Linux下面好像因为没有真正的线程,是用进程模拟的,有一个是辅助线程,所以真正程序开的线程应该只有一个。

2. pstree -c也可以达到相同的效果
$ pstree -c | grep proftpd
|-proftpd-+-proftpd
| `-proftpd

3. cat /proc/${pid}/status
可以查看大致的情况

4.  pstack

有些系统可以用这个东东,可以查看所有线程的堆栈

如何查看进程中各线程的内存占用情况?

用ps aux只能查看到进程,如果进程里面使用了pthread编程,用什么命令才能查询到进程里的线程资源占用?
ps aux | grep不就是了

8.翻转链表

给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

数据范围: 0\leq n\leq10000≤n≤1000

要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。

struct ListNode* ReverseList(struct ListNode* pHead ) {

    struct ListNode* newhead = NULL;

    struct ListNode* cur = pHead;

    while(cur)
    {
        //1 保存需要头插节点的下一个节点
        struct ListNode* next = cur->next;

        //2 将头插节点插到新链表
        cur->next = newhead;
        newhead = cur;
        cur = next;
    }

    return newhead;
    // write code here
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享文章:北京嘉楠科技面试总结-创新互联
网站链接:http://pwwzsj.com/article/ccshii.html