c++面试常见问题2019-10-01

mac2022-06-30  89

面向过程:就是把一个问题分解成一个一个的步骤,依次实现每个步骤,使用时依次调用。

优点:性能高。

缺点:扩展性差,复用差,不易维护。

面向对象:把问题分解成各个对象,描述某个事物在解决整个问题中的步骤行为。

优点:扩展性好,易复用,易维护。

缺点:性能低。、

面向对象四个特性:

1、封装:把一类事物的属性和行为抽象出来,使其属性私有化,行为公开化,提高了数据的隐私,同时复用性高。

2、继承:把多个类共有的属性和方法抽象出来,把共同的定义为一个父类,形成了继承,子类实现自己特有的功能。

3、多态:多态分为静态多态和动态多态,静态多态是函数重载,在一个类中;动态多态在运行时绑定,允许不同的类对象对同一消息作出响应。

4、抽象:抽象是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象包括两个方面,一是过程抽象,二是数据抽象。过程抽象是指任何一个明确定义功能的操作都可被使用者看作单个的实体看待,尽管这个操作实际上可能由一系列更低级的操作来完成。数据抽象定义了数据类型和施加于该类型对象上的操作,并限定了对象的值只能通过使用这些操作修改和观察。


抽象类和接口的区别:

1、抽象类是被子类继承的,接口是被类实现的。

2、接口只是定义方法声明,抽象类可以定义方法声明,也可以实现。

3、接口里定义的变量只能是公共静态变量,抽象类的变量可以是普通变量。

4、接口是设计的结果,抽象类是重构的结果。

5、接口和抽象类都是抽象具体对象的,但接口的级别更高。

6、抽象类可以有具体的属性和方法,接口只能抽象方法和不可变常量。

7、抽象类主要用来抽象类别,接口主要抽象功能。


std::move 在任何情况下都将其参数转换为右值;std::forward只在必要情况下进行这个转换。

使用std::move会无条件转换为一个右值,而使用std::forward只会把是绑定到右值引用的参数转换成右值。

std::move 减少了错误的可能性,而且更加清晰。

std::forward既需要一个函数参数(rhs.s),又需要一个模板类型参数(std::string)std::forward的参数类型必须是一个非引用的,因为编码规范上说明了传递的参数必须是一个右值。

class Widget {

public:

Widget(Widget&& rhs)

: s(std::move(rhs.s))

{ ++moveCtorCalls; }

private:

static std::size_t moveCtorCalls;

std::string s;

};

class Widget {

public:

Widget(Widget&& rhs)                      // unconventional,

: s(std::forward<std::string>(rhs.s))     // undesirable

{ ++moveCtorCalls; }                      // implementation

};

1.std::move执行一个无条件的转化到右值。它本身并不移动任何东西;

2.std::forward把其参数转换为右值,仅仅在那个参数被绑定到一个右值时;

3.std::move和std::forward在运行时(runtime)都不做任何事。


emplace_backpush_back都是向容器内添加数据。

对于在容器中添加类的对象时, 相比于push_back,emplace_back可以避免额外类的复制和移动操作。

引入了右值引用,转移构造函数后,push_back()右值时就会调用构造函数和转移构造函数,

如果可以在插入的时候直接构造,就只需要构造一次即可。这就是c++11 新加的emplace_back。在容器尾部添加一个元素,这个元素原地构造,不需要触发拷贝构造和转移构造。而且调用形式更加简洁,直接根据参数初始化临时对象的成员。


面向连接:一种网络协议,依赖发送方和接收器之间的显示通信和阻塞以管理双方的数据传输.网络系统需要在两台计算机之间发送数据之前先建立连接的一种特性。面向连接网络类似于电话系统,在开始通信前必须先进行一次呼叫和应答。

面向连接的服务(connection-oriented service)就是通信双方在通信时,要事先建立一条通信线路,其过程有建立连接、使用连接和释放连接三个过程。

TCP可靠性:报文序号、重传、流量控制和拥塞控制。


广播风暴(broadcast storm)简单的讲是指当广播数据充斥网络无法处理,并占用大量网络带宽,导致正常业务不能运行。

二、解决对策

1、检查所使用的网络设备是否是交换机,如果不是则更换正确的交换机,切记不要使用集线器。

2、使用MRGT等流量查看软件可以查看出现短路的端口,如果交换机是可网管的,也可以通过逐个封闭端口来进行处理查找,进而找到有问题的网线。找到短路的网线后,更换一根网线。

3、在接入层启用树生成协议,或者在诊断故障时打开树生成协议,以便协助确定故障点。在广播风暴发生时,应首先了解发生故障前网络的改动,建立完善的网络文档资料,包括:网络布线图、IP地址和MAC地址对应表等,可以通过局域网工具软件来扫描获取这些信息。

4、用于级联交换机的跳线应当做一些特殊标记,最好选择使用不同颜色的跳线,与其他普通跳线相区别。

5、可将其他正常的计算机接到有问题的端口上,如果故障解决,则是原先计算机的网卡损坏或网络故障所致,更换新网卡并检测线路及网络配置即可解决。

如果故障依旧,则说明原先计算机的网卡未损坏,可能是交换机的该端口已损坏,检查该端口的指示灯,如确认是该端口损坏,应及时将交换机送修或者将计算机连接到其他端口,注意,不要擅自修理交换机,否则损坏交换机得不偿失。


死锁是由于两个或两个以上的进程执行过程中竞争资源或彼此通信造成的阻塞。

四个条件:

1、互斥

2、不可剥夺

3、环路等待

4、请求和保持


虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。


编译的四个过程:

1.预处理,生成.i的文件

2.将预处理后的文件转换成汇编语言,生成.s文件

3.汇编变为目标代码(机器代码)生成.o的文件

4.连接目标代码,生成可执行程序


最新回复(0)