C/C++(3) ——基本语言(三)


C/C++(3) ——基本语言(三)


C/C++(3) ——基本语言(三)

21.Lambda表达式参数捕获

类型作用
[val]以值传递的方式捕获变量val
[=]表示值传递方式捕获所有父作用域的变量(包括this)
[&var]表示引用传递捕捉变量var
[&]表示引用传递方式捕捉所有父作用域的变量(包括this)
[=, &][=,&a,&b]表示以引用传递的方式捕捉变量a和b,以值传递方式捕捉其它所有变量。

22.C++程序到可执行文件的过程

四个阶段:预编译阶段、编译阶段、汇编阶段和链接阶段

22.1预编译阶段

①删除#define,并且展开宏定义
②处理#include头文件,将头文件插入到相应位置
③删掉所有注释部分

22.2编译阶段

①词法、语法、语义分析,中间代码生成,代码优化
②最后生成汇编语言

22.3汇编阶段

①将汇编语言转换成机器语言,并生成目标文件

22.4链接阶段

①就是将不同的目标文件链接成一个可执行文件
根据链接方式的不同,可以分为静态链接和动态链接两种。

23.编译原理静态链接和动态链接

23.1静态链接:

函数从静态库中拷贝到可执行文件中。
静态库的后缀为win下 .lib;linux下.a。

23.2动态链接

函数并不会拷贝到可执行文件中,只需要将动态库映射到进程的地址空间中,所以动态库和文件是相关联的,如果删掉动态库可执行文件就无法正常运行了。
文件后辍为:win下为.dll,linux下为.so。

24.堆和栈有什么区别?

管理方式、空间大小、碎片问题、生长方向、分配效率。
①管理方式:栈空间是由编译器自动管理,无需我们手工控制;堆空间的开辟与释放由程序员手动控制。
②空间大小:在Window下,栈的大小是2MB,Linux下,默认栈空间大小为8MB。在Window下,堆的空间大小不超过2GB。
③碎片问题:堆中频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低;栈则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间处弹出。
④生长方向:栈 高地址->低地址;堆 低地址->高地址。
⑤分配效率:栈空间是由编译器自动管理,计算机底层提供了支持,效率高;堆分配则是C/C++函数库提供的,机制复杂,效率比栈要低得多。

25.2 GB 内存的操作系统中,可以分配4 GB 的数组吗?(虚拟内存)

不可以。因为虚拟内存是由物理内存分配过来的。

26.C++函数栈空间的最大值

参考回答:
默认是1M,可以调整

27.请你来说一说extern“C”

参考回答:
C++调用C函数需要extern C,因为C语言没有函数重载。
加上 extern "C"后,会指示编译器这部分代码按 C 语言的进行编译,而不是 C++的。

28.请你说说你了解的RTTI

参考回答:
RTTI(Runtime Type Identification)是“运行时类型识别”的意思。C++引入这个机制是为了让程序在运行时能根据基类的指针或引用来获得该指针或引用所指的对象的实际类型。但是现在RTTI的类型识别已经不限于此了,它还能通过typeid操作符识别出所有的基本类型的变量对应的类型
C++通过以下两个关键字提供RTTI功能:
①typeid操作符,返回指针和引用所指的实际类型;
②dynamic_cast操作符,将基类类型的指针或引用安全地转换为其派生类类型的指针或引用。

29.C++中拷贝赋值函数的形参能否进行值传递?

参考回答:
不能。如果是这种情况下,调用拷贝构造函数的时候,首先要将实参传递给形参,这个传递的时候又要调用拷贝构造函数。死循环,无法完成拷贝,栈也会满。

30.面向对象三大特性六大原则?

三大特性
封装: 一个类封装了数据以及操作数据的代码逻辑体。定义了数据的可访问属性(私有、公有)
继承 :可以让一个类型获取另外一个类型的属性的方式。分为实现继承和接口继承。
多态 :类实例的一个方法在不同情形下有不同的表现形式,即不同的外在行为。使具有不同的内部结构的对象可以共享相同的外部接口。

六大原则
单一功能原则
单一职责原则的定义是就一个类而言,应该仅有一个引起他变化的原因。也就是说一个类应该只负责一件事情。如果一个类负责了方法M1,方法M2两个不同的事情,当M1方法发生变化的时候,我们需要修改这个类的M1方法,但是这个时候就有可能导致M2方法不能工作。这个不是我们期待的,但是由于这种设计却很有可能发生。所以这个时候,我们需要把M1方法,M2方法单独分离成两个类。让每个类只专心处理自己的方法。
单一职责原则的好处如下:

可以降低类的复杂度,一个类只负责一项职责,这样逻辑也简单很多
提高类的可读性,和系统的维护性,因为不会有其他奇怪的方法来干扰我们理解这个类的含义
当发生变化的时候,能将变化的影响降到最小,因为只会在这个类中做出修改。

开放封闭原则
开闭原则的定义是软件中的对象(类,模块,函数等)应该对于扩展是开放的,但是对于修改是关闭的
当需求发生改变的时候,我们需要对代码进行修改,这个时候我们应该尽量去扩展原来的代码,而不是去修改原来的代码,因为这样可能会引起更多的问题。
替换原则(里氏代换原则)
子类能够替换父类,出现在父类能够出现的任何地方。当使用继承时,尽量遵循历史替换原则,尽量不要去重写或者重载父类的方法,以免破坏整个继承体系的 。因为父类在定义或者实现某些方法时,规定了必须遵守的规则和契约。
依赖原则
具体依赖抽象,上层依赖下层。核心思想是面向接口编程。两个模块之间依赖的应该是抽象(接口或抽象类)而不是细节。细节(实现类)依赖于抽象。依赖原则基于的事实:相对于实现类的多变性,抽象的东西要稳定得多,基于抽象的构架也比基于实现的架构更加稳定,且扩展性更高。
接口分离原则
模块间要通过具体接口分离开,而不是通过类强耦合。例如A类对B类的依赖,可以抽象接口I,B实现I,A类依赖I来实现。但是抽象接口必须功能最小化(与单一功能原则有点不谋而合)。
迪米特原则
最小依赖原则,一个类对其他类尽可能少的了解,只与朋友通信。降低耦合。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值