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音乐,有道词典等其他应用程序(即,其他的进程),这表明:不同进程之间也可以并发执行。

程序员面试常见问题总结【1】相关推荐

  1. 程序员面试常见问题有哪些?如何回答才能拿到offer?

    身边有很多程序员小伙伴,明明业务能力很强,但总是因为面试与大厂失之交臂.其实,面试也是一门大学问,它不仅考验一个人的学识和工作积累,也考验临场反应能力和语言表达能力.面试官要通过短短一个面试来判断你是 ...

  2. 北美程序员面试常见问题

    面试时需要写注释吗? 一般不需要,具体可以问面试官 刷题刷到什么程度可以去面试了呢? lintcode 把200-300个题目刷两遍, 其中刷过的题目60%题目做到bug free,就比较好啦. 面试 ...

  3. 程序员面试常见问题-长期更新

    目录 一.计算机网络 1.TCP的三次握手四次挥手 三次握手 四次挥手(详细说明) TCP和UDP的区别 为什么TCP连接的时候是3次?2次不可以吗? 为什么TCP连接的时候是3次,关闭的时候却是4次 ...

  4. 程序员面试常见问题及回答技巧

    1.如果我们不能提供你所要求的薪水,你还愿意来我们公司吗?你的期望薪水是多少?你想得到的薪水是多 少?如果达不到你的要求,怎么办? 答:我认为工作最重要的是合作开心,薪酬是其次的,不过我原来的月薪是× ...

  5. 初中级php程序员面试时常见问题整理

    初中级php程序员面试问题收集 感悟 有时候草率给出一个答案,比思而无果更糟糕 php基础 php的数据类型 php数据类型的转换 php魔术方法 php 的trait的概念及特点 php 虚拟类和接 ...

  6. 收藏 | 应对程序员面试,你必须知道的8大数据结构

    来源:大数据文摘 本文共2200字,建议阅读6分钟. 本文我们介绍了应对程序员面试过程中,必须掌握的几大数据结构. 瑞士计算机科学家Niklaus Wirth在1976年写了一本书,名为<算法+ ...

  7. 【面试招聘】程序员面试完全指南

    春季是求职的黄金时期,借这时机分享下程序员面试相关的感悟. 本文立意不仅于面试技巧,而贵在通过梳理面试过程,帮助大家系统地完善技能树,找到更有发展前景的工作平台.一场完整的面试通常包括:简历准备.笔试 ...

  8. 程序员面试算法_程序员的前20个搜索和排序算法面试问题

    程序员面试算法 大家好,如果您正在准备编程工作面试或正在寻找新工作,那么您知道这不是一个容易的过程. 在您职业的任何阶段,您都必须幸运地接到电话并进行第一轮面试,但是在初学者方面,当您寻找第一份工作时 ...

  9. 我的新书——《PHP程序员面试笔试宝典》

    你好,是我琉忆. 一个文艺的PHP开发工程师. 很荣幸能够在这里带来我的第一本新书--<PHP程序员面试笔试宝典>. 一.创作过程 <PHP程序员面试笔试宝典>是我的第一本书, ...

最新文章

  1. kaggle机器学习 入门
  2. c语言预处理器指令的简单例子
  3. Arduino 与 SPI 结合使用 以及SPI 深层理解
  4. 应用实例_兴达奇智能燃烧控制器BMU460DP现场应用实例图
  5. #pragma pack 用法详解
  6. 图像分割(二)--Graph Cuts
  7. python图片x轴数据过多_一个操作证明python数据可视化比excel强百倍:X轴刻度间隔显示...
  8. Android8.0一键root,小米Mix 2(安卓8.0)一键ROOT详解教程,看教程ROOT
  9. JS里给日期增加n个月的方法
  10. 伪装成抖音国际版Tiktok的短信蠕虫(病毒分析)
  11. 初识霍夫变换——霍夫变换直线检测原理(Line Detection)
  12. 计算思维及其培养方式
  13. HTML页面设置ico图标
  14. VUE优秀UI组件库(PC和Mobile)
  15. [安卓开发]弹幕滚幕效果自定义View之BarrageView|支持点击事件|隐藏不滞留|颜色随机|大小速度范围随机
  16. 黑幕!!!威客网站七宗罪?一个威客的自诉
  17. 企业IM即时通讯软件需要具备哪些功能?
  18. 实例解读:用MAC地址定位目标主机
  19. JAVA 基础深化和提高【上】
  20. 一次FGC导致CPU飙高的排查过程

热门文章

  1. 知识分享|药品稳定性试验
  2. plot绘图只能在工具栏的预览显示,无法全屏弹窗显示---matlab 不学无术小问题
  3. [USACO 2021.02 Feb]Problem 3. Clockwise Fence
  4. 【数据结构——栈篇】
  5. 稀疏矩阵概念及简单实现
  6. 深度:亚马逊卖家求变,换一种方式增长!
  7. lisp对excel其他行列写入_Visual_LISP与Excel电子表格
  8. Android MD风格颜色汇总
  9. (十九)冲动是魔鬼 - 10
  10. ssm预先加载数据的四种方式