[C++面试高频]C++基础(十)

1.宏和类模板的区别

①宏是在预处理阶段处理,模板是在编译阶段处理。

②宏不会进行语法检查,只会进行简单的文本替换,模板会进行语法检查。

③宏直接就可以产生代码,而编译器遇到模板定义时并不产生代码,只有当模板实例化后才会产生代码。

2.多态与继承的关系

继承的功能在于代码复用,在基类中提供统一的虚函数接口,让派生类进行重写,然后就可以使用多态了。

3.智能指针的实现原理

智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数结束时会自动被释放,就不用担心内存泄漏的问题了。

常用的四个智能指针有:auto_ptr,unique_ptr,shared_ptr,weak_ptr,后面三个是C++支持的,第一个被弃用。

①auto指针存在的问题是,两个智能指针同时指向一块内存,就会两次释放同一块资源,存在潜在的内存崩溃问题。因此auto指针被C++弃用。应该用unique指针替代auto指针。

②unique指针规定一个智能指针独占一块内存资源。当两个智能指针同时指向同一块内存,编译器报错。

③shared_ptr实现共享式拥有概念。多个智能指针,可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时释放。

④shared_ptr存在共享指针的循环引用计数问题。weak_ptr是弱引用,weak_ptr的构造和析构不会引起引用计数的增加或减少。我们可以将其中一个改为weak_ptr指针就可以了。比如我们将class B里shared_ptr换成weak_ptr。

4.继承和组合的适用场景总结

继承和组合都是面向对象中代码复用的方式。

继承:比如A类继承B类,A除能使用B中的除私有成员外的所有元素和方法,且由A派生的其它类最后可通过B类容器存储调用,实现不同派生类的虚函方法。

继承体现的是以一种专门化的概念而组合是一种组装的概念。

要确定是组合还是继承,就要确定是否需要新类向上映射,也就是说当我们想重用原类型作为新类型的内部实现的话,最好用组合,如果不仅想重用内部实现而且还想重用接口的话,那就用继承。一般对于大型程序来说,优先使用组合,组合还有个优点就是有助于保持每个类被封装,并被集中在单个任务上。

5.举出操作系统中并行问题

(1)生产消费者问题

生产消费者问题也称为有限缓冲问题,是一个经典的多线程同步问题。该问题中有如下三个主体。

①固定大小的共享缓冲区。

②生产者线程,负责重复消耗缓冲区数据。

③消费者线程,负责重复消耗缓冲区数据。

问题关键在于确保生产者不会在缓冲区满时写入数据,消费者也不会在缓冲区中为空时小号数据。换句话,缓冲区可用部分的多少是关键数据。

(2)读者-写者问题

读者-写者问题发生在多线程读或写同一共享资源时,通常,任一时刻只允许有一个线程资源,且如有线程正在写资源,则所有读操作也会被阻塞。如无线程整在写,则多个线程可同时读取该资源。

通用的解决方案是使用读写锁,该锁中可将读与写操作互斥,而在读本身上使用信号量进行计数即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值