程序员面试常见问题总结【1】

1、C++里的class和struct有什么区别?

        在c++中可以用 struct 和 class 来定义类型,本质的一个区别就是默认的访问控制,体现在两个方面,两者的区别如下:

(1)关于默认访问类型

       如果没有标明成员函数或者成员变量的访问权限级别,那么 struct 中默认的是 public,而在 class 中默认的是 private

例如:

          struct A
         {
            char a;
         };
         struct B : A
        {
           char b;
        };
       这个时候B是public继承A的。如果都将上面的struct改成class,那么B是private继承A的。这就是 默认的继承访问权限。所以我们在平时写类继承的时候,通常会这样写:
        struct B : public A
就是为了指明是public继承,而不是用默认的private继承。 当然,到底默认是public继承还是private继承,取决于子类而不是基类。struct可以继承class,同样class也可以继承struct,那么默认的继承访问权限是看子类到底是用的struct还是class。
如下:
          struct A{};
          class B : A{};      //private继承
          struct C : B{}; //public继承

注意:而在C#中如果没有标明成员函数或者成员变量的访问权限级别,则在 struct 和 class 中都是 private 的。struct 和 class 的区别是 struct 定义的是值类型,值类型的实例在上分配内存;而 class 定义的是引用类型,引用类型的实例在上分配内存。

(2)struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的。

       注意我上面的用词,我依旧强调struct是一种数据结构的实现体,虽然它是可以像 class 一样的用。我依旧将 struct 里的变量叫数据,class内的变量叫成员,虽然它们并无区别。其实,到底是用struct还是class,完全看个人的喜好,你可以将你程序里所有的class全部替换成struct,它依旧可以很正常的运行。但我给出的最好建议还是:当你觉得你要做的更像是一种数据结构的话,那么用struct,如果你要做的更像是一种对象的话,那么用class。
       当然,我在这里还要强调一点的就是,对于访问控制,应该在程序里明确的指出,而不是依靠默认,这是一个良好的习惯,也让你的代码更具可读性。

2. 全局变量和局部变量有什么区别?是怎么实现的?

(1)全局变量和局部变量的区别是作用域的不同。

全局变量为外部变量,起作用域是从定义位置开始到程序结束;而局部变量就表示局限于某个作用域的变量,它可以在函数内以函数作为作用域,或者for/while/if 语句中,以语句块作为作用域,还可以在namespace中,以命名空间作为作用域。

(2) 在操作系统中 全局变量 存储在内存的【静态存储区域】,而局部变量存放在【内存的栈区】,生命周期到,自动释放内存。

       操作系统和编译器根据内存分配的位置来知道全局变量分配在全局数据段,并且在程序运行时就被加载。

       编译器通过语句的分析,判断出是全局变量还是局部变量。

  • 若是全局变量,编译器将源代码翻译成二进制代码时就会为全局变量分配一个虚拟地址(Windows:0X00400000以上的地址,即所说的全局区(静态区)),所以程序在对全局变量进行操作是对一个硬编码的地址进行操作。
  • 若是局部变量,编译时不分配空间,而是以相对偏移地址来表示局部变量的地址,所以局部变量只有在局部变量位置被调用时才会被真正的分配内存。【函数执行时,局部变量在栈中分配,函数调用完毕释放局部变量对应的内存】

C++内存分配方式详解,请参考c++内存分配方式。

     操作系统通过变量的分配地址就可以判断出是局部变量还是全局比变量。

3. 线程&进程的基本概念,两者之间的关系

(1)进程 & 线程 概念

进程(process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位

线程(thread是进程执行运算的最小单位,是进程中的一个实体,是被处理机(CPU)独立调度和分派的基本单位线程自己没有系统资源,只拥有一点在运行中必不可少的资源(如:程序计数器,一组寄存器和栈),但它可以与同属一个进程的其他线程共享进程所拥有的全部资源。

(2)进程 & 线程之间的关系

  • 一个线程可以创建和撤销另一个线程,同一个进程的多个线程之间可以并发执行
  • 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
  • 资源分配给进程,同一个进程的所有线程共享该进程的所有资源。
  • 处理机(CPU)分配给线程,及真正在处理机上运行的是线程。
  • 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的方法实现同步。

(3)进程 & 线程的区别

  • 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
  • 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行。
  • 拥有资源:进程是拥有资源的一个独立单位,线程不用有系统资源,但可以访问其隶属于进程的全部资源。
  • 系统开销:在创建或者撤销进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或者撤销线程时的开销。

(4)关于进程 & 线程一个实例

       打开QQ程序——相当于打开了一个进程。

       运行QQ过程中,弹出一个对话窗口,跟别人语音聊天、文字聊天——这分别对应了3个线程,这三个线程可以同时运行,说明:同一个进程中的多个线程之间可以并发执行。但你不能在没有打开QQ程序时进行这些操作,说明:线程不能独立进行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

       而在运行QQ程序的同时,我们又可以同时打开QQ音乐,有道词典等其他应用程序(即,其他的进程),这表明:不同进程之间也可以并发执行。


你可能感兴趣的:(C++,程序员面试)