面试官最爱问的特殊类到底是怎么肥四

2023-11-22 05:21

本文主要是介绍面试官最爱问的特殊类到底是怎么肥四,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1、请设计一个类,只能在堆上创建对象

2、请设计一个类,只能在栈上创建对象

3、请设计一个类,不能被拷贝

4、请设计一个类,不能被继承

5、请设计一个类,只能创建一个对象(单例模式)

饿汉模式

懒汉模式


面试官:请设计一个类...

我:

然后,我就想到一句话

让我康康还有谁跟我一样“死鱼安乐”,扶我起来,我还能学!!

1、请设计一个类,只能在堆上创建对象

实现方式:

  • 将类的构造函数私有,拷贝构造声明成私有,防止别人调用拷贝构造在栈上生成对象
  • 提供一个静态成员函数,在该静态成员函数中完成堆对象的创建
//只能在堆上创建对象
class HeapOnly
{
public://公有的方法,创建对象static HeapOnly* getOBJ(){//堆上创建对象return new HeapOnly;}
private://构造函数私有化HeapOnly(){}//防拷贝//C++ 98//拷贝构造私有化,只声明不实现HeapOnly(const HeapOnly& ho);//C++ 11//直接定义成delete函数//HeapOnly(const HeapOnly& ho) = delete;
};

2、请设计一个类,只能在栈上创建对象

方法一:将构造函数私有化,设计静态方法创建对象

//只能在栈上创建对象
class StackOnly
{
public://公有的方法,在栈上创建对象static StackOnly getOBJ(){StackOnly so;return so;}private://构造函数私有化StackOnly(){}
};

方法二:屏蔽掉new

//只能在栈上创建对象
class StackOnly
{
public:static StackOnly getOBJ(){StackOnly so;return so;}
private://C++ 98void* operator new(size_t n);void operator delete(void* ptr);//C++ 11//void* operator new(size_t n) = delete;//void operator delete(void* ptr) = delete;StackOnly(){}
};

3、请设计一个类,不能被拷贝

拷贝只会发生在两个场景:拷贝构造函数和赋值运算符重载,想让一个类进制拷贝,只需要让该类不能调用拷贝构造函数和赋值运算符重载

  • C++ 98

将拷贝构造函数和赋值运算符重载只声明不定义,将其访问权限设置为私有

原因:

只声明不定义:该函数根本不会调用,定义了也没什么意义

设置成私有:如果只声明没有设置成private,用户如果自己在类外定义了,就不能禁止拷贝了

class CopyBan{
public://...
private:CopyBan(const CopyBan&);CopyBan& operator=(const CopyBan&);CopyBan(){}
};
  • C++ 11

delete的使用, 在默认成员函数后加上=delete,声明为delete的函数不能被调用

class CopyBan{//...CopyBan(const CopyBan&) = delete;CopyBan& operator=(const CopyBan&) = delete;CopyBan(){}//...
};

4、请设计一个类,不能被继承

  • C++ 98

构造函数私有化,派生类调不到基类的构造函数,无法继承

class A{
public:static A getInstance(){return A();}
private:A(){}
};
  • C++ 11

final关键字,final修饰类表示该类不能被继承

class A final{//...
};

5、请设计一个类,只能创建一个对象(单例模式)

  • 饿汉模式

在程序初始化阶段完成资源的申请加载初始化,对象的实例化(思想:以空间换时间)不涉及线程安全问题

饿汉方式实现单例模式:

成员变量静态化(资源共享);构造函数私有化

//饿汉模式
class Singleton
{
public://公有的static方法static Singleton& getOBJ(){return _singleton;}
private://构造函数私有化Singleton(){}//防拷贝Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;//static成员static Singleton _singleton;
};Singleton Singleton::_singleton; //在程序入口之前就完成单例对象的初始化
  • 懒汉模式

资源在使用时才加载、初始化(思想:“延时加载”)

懒汉方式实现单例模式:

资源使用静态指针——资源共享,延迟加载

加锁保护——线程安全

二次检测——减少锁冲突,提高效率

class Singleton
{
public://static公有方法创建对象:第一次调用时创建对象static Singleton* getOBJ(){//提高效率if (_ptr == nullptr){_mtx.lock();//创建对象:第一次调用时创建对象//保证单例if (_ptr == nullptr){_ptr = new Singleton;}_mtx.unlock();}return _ptr;}class GarbageGC{~GarbageGC(){if (_ptr)delete _ptr;}};private://构造函数私有Singleton(){cout << "Singleton()" << endl;}//防拷贝Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton* _ptr;static mutex _mtx;static GarbageGC _gc;
};Singleton* Singleton::_ptr = nullptr;
mutex Singleton::_mtx;
Singleton::GarbageGC Singleton::_gc;

都学废了吗?面试冲鸭!!

这篇关于面试官最爱问的特殊类到底是怎么肥四的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/m0_46657980/article/details/117589501
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/407818

相关文章

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

Mac备忘录怎么导出/备份和云同步? Mac备忘录使用技巧

《Mac备忘录怎么导出/备份和云同步?Mac备忘录使用技巧》备忘录作为iOS里简单而又不可或缺的一个系统应用,上手容易,可以满足我们日常生活中各种记录的需求,今天我们就来看看Mac备忘录的导出、... 「备忘录」是 MAC 上的一款常用应用,它可以帮助我们捕捉灵感、记录待办事项或保存重要信息。为了便于在不同

springboot+vue项目怎么解决跨域问题详解

《springboot+vue项目怎么解决跨域问题详解》:本文主要介绍springboot+vue项目怎么解决跨域问题的相关资料,包括前端代理、后端全局配置CORS、注解配置和Nginx反向代理,... 目录1. 前端代理(开发环境推荐)2. 后端全局配置 CORS(生产环境推荐)3. 后端注解配置(按接口

一文带你搞懂Python中__init__.py到底是什么

《一文带你搞懂Python中__init__.py到底是什么》朋友们,今天我们来聊聊Python里一个低调却至关重要的文件——__init__.py,有些人可能听说过它是“包的标志”,也有人觉得它“没... 目录先搞懂 python 模块(module)Python 包(package)是啥?那么 __in

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

电脑开机提示krpt.dll丢失怎么解决? krpt.dll文件缺失的多种解决办法

《电脑开机提示krpt.dll丢失怎么解决?krpt.dll文件缺失的多种解决办法》krpt.dll是Windows操作系统中的一个动态链接库文件,它对于系统的正常运行起着重要的作用,本文将详细介绍... 在使用 Windows 操作系统的过程中,用户有时会遇到各种错误提示,其中“找不到 krpt.dll”

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误