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

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;

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

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



http://www.chinasem.cn/article/407818

相关文章

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

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

Rsnapshot怎么用? 基于Rsync的强大Linux备份工具使用指南

《Rsnapshot怎么用?基于Rsync的强大Linux备份工具使用指南》Rsnapshot不仅可以备份本地文件,还能通过SSH备份远程文件,接下来详细介绍如何安装、配置和使用Rsnaps... Rsnapshot 是一款开源的文件系统快照工具。它结合了 Rsync 和 SSH 的能力,可以帮助你在 li

电脑密码怎么设置? 一文读懂电脑密码的详细指南

《电脑密码怎么设置?一文读懂电脑密码的详细指南》为了保护个人隐私和数据安全,设置电脑密码显得尤为重要,那么,如何在电脑上设置密码呢?详细请看下文介绍... 设置电脑密码是保护个人隐私、数据安全以及系统安全的重要措施,下面以Windows 11系统为例,跟大家分享一下设置电脑密码的具体办php法。Windo

怎么关闭Ubuntu无人值守升级? Ubuntu禁止自动更新的技巧

《怎么关闭Ubuntu无人值守升级?Ubuntu禁止自动更新的技巧》UbuntuLinux系统禁止自动更新的时候,提示“无人值守升级在关机期间,请不要关闭计算机进程”,该怎么解决这个问题?详细请看... 本教程教你如何处理无人值守的升级,即 Ubuntu linux 的自动系统更新。来源:https://

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

LinuxMint怎么安装? Linux Mint22下载安装图文教程

《LinuxMint怎么安装?LinuxMint22下载安装图文教程》LinuxMint22发布以后,有很多新功能,很多朋友想要下载并安装,该怎么操作呢?下面我们就来看看详细安装指南... linux Mint 是一款基于 Ubuntu 的流行发行版,凭借其现代、精致、易于使用的特性,深受小伙伴们所喜爱。对

macOS怎么轻松更换App图标? Mac电脑图标更换指南

《macOS怎么轻松更换App图标?Mac电脑图标更换指南》想要给你的Mac电脑按照自己的喜好来更换App图标?其实非常简单,只需要两步就能搞定,下面我来详细讲解一下... 虽然 MACOS 的个性化定制选项已经「缩水」,不如早期版本那么丰富,www.chinasem.cn但我们仍然可以按照自己的喜好来更换

Ubuntu 怎么启用 Universe 和 Multiverse 软件源?

《Ubuntu怎么启用Universe和Multiverse软件源?》在Ubuntu中,软件源是用于获取和安装软件的服务器,通过设置和管理软件源,您可以确保系统能够从可靠的来源获取最新的软件... Ubuntu 是一款广受认可且声誉良好的开源操作系统,允许用户通过其庞大的软件包来定制和增强计算体验。这些软件

Ubuntu 24.04 LTS怎么关闭 Ubuntu Pro 更新提示弹窗?

《Ubuntu24.04LTS怎么关闭UbuntuPro更新提示弹窗?》Ubuntu每次开机都会弹窗提示安全更新,设置里最多只能取消自动下载,自动更新,但无法做到直接让自动更新的弹窗不出现,... 如果你正在使用 Ubuntu 24.04 LTS,可能会注意到——在使用「软件更新器」或运行 APT 命令时,

TP-LINK/水星和hasivo交换机怎么选? 三款网管交换机系统功能对比

《TP-LINK/水星和hasivo交换机怎么选?三款网管交换机系统功能对比》今天选了三款都是”8+1″的2.5G网管交换机,分别是TP-LINK水星和hasivo交换机,该怎么选呢?这些交换机功... TP-LINK、水星和hasivo这三台交换机都是”8+1″的2.5G网管交换机,我手里的China编程has