深信服 第一面

开心啊,终于有一次电面了,投腾讯,爱奇艺笔试过了面试未去(第一太远,第二感觉实力不够),美团,蘑菇街未收到通知,上午发的消息, 今天晚上面试,比预期提早了半个小时,还好没啥影响,于是复习了一下午c/c++,真的猜对了好多题,但是第一次面试太紧张了,总是没说中关键点。中途由于机房手机信号不好尴尬的5分钟左右。。。。想吐槽这个机房。。。。

简单个人介绍

首先重c开始问

1.全局变量和局部变量的区别

作用域不同,全局变量存放在静态区,不初始化时默认为0,局部变量存放在栈区,不初始化,不确定其值。

局部同时有全局和局部的相同名字的变量,可通过::来使用全局变量

2.const 和 define 的区别

3.const char*  和 const *char 的区别

const char* p =char const *p 指针的值不可修改

char *const p   指针地址不可修改

const定义的值可以修改吗?

可以。

  1. const全局变量存储在全局存储空间,其值只有可读属性,不能修改;
  2. const局部变量存储在堆栈中,可通过指针修改其值;
  3. const变量在预处理时处理,编译器只对其值读取一次。

(1)const修饰函数参数
          1.如果输入的参数采用“指针传递”,那么加上const可以防止意外的改动该指针,起到保护作用
        例如:void func(char *dest_str, const char *src_str)
        
        2.如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就不需要保护所以
        不用加const也可以
        例如:void func(int x)不用写成void func(const int x)
       
        3.但是对于非内部的数据类型的参数而言,例如void func( A a)这样声明的函数注定效率低,因为函数体内
        将自动产生临时对象,用于复制该参数a,而临时变量的构造,拷贝构造,析构都将耗费时间。所以为了提高效率
        可以写成这样void func(A &a)用“引用传递”就不用产生临时对象,如果不想改变参数a就写成
        void func(const A &a)
 (2)const修饰函数返回值 
        1.以“指针传递”方式的函数返回值加上const修饰,那么该函数的返回值的内容不能被修改
         例如:const char *get_string(void)
         
         2.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部的临时存储单元中,所以加上const修饰
         没有意义,
         例如:int get_number(void)不用写成const int get_number(void)
        
         3.但是返回值不是内部数据类型,例如:A get_string(void),这样会产生一个临时的对象用来存放返回的数据,
         会调用拷贝构造函数,这样效率会低,所以采用“引用传递”A &get_string(void),如果加上const那么返回值的
         内容就不会被改变const A &get_string(void)
 (3)const修饰成员函数 
         1.任何不会修改成员的函数都应该声明为const类型。
         例如计数函数不会对成员进行修改所以int get_count(void)const;注意const成员函数的声明将const放到
         函数的尾部。
         
         2.const成员函数不可以修改对象的数据。
            const对象只能访问const成员函数,非const对象可以任意访问任意的成员函数。
         
         3.class A{
            public:
                int get_count(int)const;
            }
          int get_count(int)const准确的说这个const修饰的是this指向的对象,其实get_count(int)这个函数在
          调用方法时会被编译器改写成get_count(A *const this, int)const;为了不允许get_count()这个函数改变
          this指向的对象,则用const修饰这个函数,因此this指针的类型变为const A *const this 

4.static

存放在静态区

作用域仅局限于本文件

5.switch

case 后面可以跟变量吗?答:可以跟const修饰的常量,不可跟变量

default的用途? 答:当前面所有case不满足

然后问c++

1.extern的作用

可用于c/c++混写。在别处声明的变量或者c文件(外链接),相当于拷贝到当前文件

2.虚函数的了解

3.基类的析构函数是否需要加virtual

4.class和struct 的区别

5.printf如何输出多个参数(不清楚参数的情况下)

6.c语言如何调用c++的函数

linux

1.i/o模型有几种

  (1) 阻塞I/O (Blocking I/O)

  (2) 非阻塞I/O (Non-Blocking I/O)

  (3) I/O复用(I/O Multiplexing)

  (4) 信号驱动的I/O (Signal Driven I/O)

  (5) 异步I/O (Asynchrnous I/O)

数据结构

1.排序算法有哪些,复杂度是多少

2.最快的查找

3.list和vector的区别

vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。
因此能高效的进行随机存取,时间复杂度为o(1);
但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存块的拷贝,时间复杂度为o(n)。
另外,当数组中内存空间不够时,会重新申请一块内存空间并进行内存拷贝。

list是由双向链表实现的,因此内存空间是不连续的。
只能通过指针访问数据,所以list的随机存取非常没有效率,时间复杂度为o(n);
由于链表的特点,能高效地进行插入和删除

算法

判断一个链表内是否有环(当时有点蒙,这道题去年学长刚从北京回来,因为我替他跑步然后请我吃饭,和我提到过一下,用两个指针,当时不是特别理解,但是没管,于是口胡了一个和当时学长问我时同样的说法,所以面试官没继续问下去了。。。。当时好想说要是换道题我肯定会啊)

问:你会其他的吗,对虚拟化和云计算有了解吗

答:没,现在有在学网络编程

问:tcp和udp的区别

答案链接

问:简单的服务器实现

问:socket参数

问:tcp,udp传递时用的函数

问:有看过unix环境高级编程 

猜你喜欢

转载自blog.csdn.net/fanhansheng/article/details/79903190