【C++特殊类设计】

Spec-Kit实战:用‘规范驱动开发’重构一个老旧Node.js项目(避坑指南) 本文详细介绍了如何使用Spec-Kit工具通过‘规范驱动开发’(SDD)重构老旧Node.js项目。从逆向工程提取规范到增量改造策略,再到避免典型陷阱,提供了实战指南和避坑技巧,帮助开发者高效实现架构现代化,显著提升代码质量和维护效率。 阅读详情

1 设计一个类,不能被拷贝

拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。

  • C++98:将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可。
class HYQ
{
	// ...

private:
	HYQ(const HYQ&);
	HYQ& operator=(const HYQ&);
	//...
};

原因:

  1. 设置成私有:如果只声明没有设置成private,用户自己如果在类外定义了,则不能禁止拷贝了。
  2. 只声明不定义:不定义是因为该函数根本不会调用,定义了其实也没有什么意义,不写反而还简单。而且如果定义了就不会防止成员函数内部拷贝了。
  • C++11

C++11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上=delete,表示让编译器删除掉该默认成员函数。

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

2 设计一个类,只能在堆上创建对象

方案一:析构函数私有化

class HeapOnly
{
public :
	// static没有this指针
	static void Destroy(HeapOnly* ptr)
	{
		delete ptr;
	}

private:
	// 方案一:析构函数私有化
	~HeapOnly()
	{ 
		cout << " ~HeapOnly()" << endl;
	}
};

int main()
{
	//HeapOnly hp1;
	//Static HeapOnly hp2;

	HeapOnly* ptr = new HeapOnly;

	// 析构不能用了,如何释放了?
	// 答:在类域里面写一个Destroy函数
	HeapOnly::Destroy(ptr);

}
class HeapOnly
{
public:
	void Destroy()
	{
		delete this;
	}

private:
	~HeapOnly()
	{
		cout << " ~HeapOnly()" << endl;
	}
};

int main()
{
	HeapOnly* ptr = new HeapOnly;

	ptr->Destroy();
}

方案二:构造函数私有化

class HeapOnly
{
public:
	// 必须加static,它没有this指针,不需要创建对象去调用
	static HeapOnly* CreateObj()
	{
		return new HeapOnly;
	}

	HeapOnly(const HeapOnly& hp) = delete;
	// 这是为了防止用户在堆上创建对象后
	// 通过拷贝的方式绕过我们的限制
	// 制造出栈上的临时对象或副本
	// 从而破坏了“只能在堆上创建”的设计原则。

private:
	HeapOnly()
	{
		cout << " HeapOnly()" << endl;
	}
};

int main()
{
	//HeapOnly hp1;
	//Static HeapOnly hp2;
	//HeapOnly* ptr = new HeapOnly;
	// 上面三种都不行了
	
	HeapOnly* ptr = HeapOnly::CreateObj();

	// HeapOnly copy(*ptr);
}

3 设计一个类,只能在栈上创建对象

// 请设计一个类,只能在栈上创建对象
class StackOnly
{
public:
	static StackOnly CreateObj()
	{
		StackOnly obj;
		return obj;
	}

	//StackOnly(const StackOnly&) = delete;

	void* operator new(size_t size) = delete;

private:
	StackOnly()
	{
		cout << "StackOnly()" << endl;
	}
};

int main()
{
	StackOnly obj = StackOnly::CreateObj();

	// new禁用了,就不能在堆上开空间
	//StackOnly* ptr = new StackOnly;  

	// 但可以这样
	// StackOnly* ptr = new StackOnly(obj);
	// 除非禁掉operator new

	return 0;
}

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

C++98方式:

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

C++11方法:

  • final关键字,final修饰类,表示该类不能被继承。
class A  final
{
    // ....
};
Dell R730安装Windows Server 2008 R2 一、RAID驱动准备  在安装Windows server2008 R2操作系统时,如果没有发现硬盘,请将下面的阵列卡驱动先解压(在下载的.exe文件,双击点下一步会自动解压),解压后把那文件夹复制到U盘中。阵列卡 PERC9 H330 - H730 - H730P - H830 Controllers for Windows Server 2008 R2二、系统安装方法方法一:光盘安装  ①请您... 阅读详情

相关推荐

博途 V15.1安装步骤

温馨提醒:安装此软件电脑配置至少应满足以下要求 处理器 CoreTM i5-3320M 3.3 GHz 或相当 内存 至少8G 硬盘 300 GB SSD 显示器 15.6' 宽屏显示 (1920 x 1080) 1.双击打开【Siemens v15.1】文件夹。 2.鼠标右击【STEP 7 BasicProfess...

谢谢关注“小鱼教你模数电”,各平台同号 9万+

【C++】特殊类的设计、单例模式以及Cpp类型转换

本文深入探讨C++中特殊类的设计方法与类型转换机制。针对特殊类设计,详细解析如何实现禁止拷贝、限制对象创建于堆/栈、防止继承及单例模式(饿汉与懒汉),并分析其应用场景与线程安全问题。在类型转换部分,系统介绍C++四种强制转换操作符(static_cast、reinterpret_cast、const_cast、dynamic_cast)的原理与适用场景,剖析隐式转换的潜在风险(如数据截断与死循环),并对比C风格转换的缺陷。通过实例代码与场景分析,帮助开发者掌握高效、安全的编程实践,提升代码健壮性与可维护性。

2303_77756141的博客 2236

中断向量表配置不当引发Default_Handler死循环问题解析

本文深入解析STM32开发中因中断向量表配置不当导致的Default_Handler死循环问题。以STM32F407VET6为例,详细阐述中断向量表的工作原理、常见触发场景及系统化排查方法,并提供使用STM32CubeMX的正确姿势和手动配置的注意事项,帮助开发者快速定位并解决这一常见难题。

grafana6viz的博客 179

[cpp进阶]C++特殊类设计

为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有套路的,后来孙子就总结出了《孙子兵法》。孙子兵法也是类似。

weixin_53027918的博客 961

【Rcode】生存分析: KM & COX回归& 随机森林& nomogram

本文使用了R——survival包下的lung数据进行方法测试: 1)KM 2) Cox回归:多因素 3)随机森林因子(根据cox回归结果) 4)nomogram ( 根据cox回归结果,建立了中位生存时间,1年5年生存率的概率计算) -------------------????????‍♀️本文只有干货,非常干!????----------------------------- 一、数据加载 #生存分析 library("survival") library("survminer") data("

weixin_43172152的博客 9274

实战指南:从零搭建ROS2 + Cartographer 2D激光SLAM系统

本文详细介绍了如何从零开始搭建ROS2与Cartographer结合的2D激光SLAM系统,涵盖环境准备、激光雷达驱动配置、Cartographer安装与参数调优等关键步骤。通过实战案例和常见问题解决方案,帮助开发者快速掌握激光雷达建图技术,提升机器人自主导航能力。

weixin_29062255的博客 403

【C++】特殊类的设计

一个类不能被拷贝的需求还是比较常见的,比如IO流、线程等。拷贝只会发生在两个场景中:**拷贝构造和赋值重载**,所以想让一个类不能被拷贝,只需要让这个类的拷贝构造和赋值重载不能被调用就可。

小羊的博客 3829

Android逆向实战:抖音聊天记录数据库解析与导出(附完整SQL查询)

本文提供了一份Android逆向实战指南,详细解析了抖音聊天记录数据库的结构与导出方法。通过定位核心的`im.db`数据库文件,深度解读conversation_list、msg等关键表结构,并附上完整的SQL查询语句,帮助开发者或研究人员安全、合规地提取和分析本地聊天数据,适用于移动安全研究与数据分析场景。

mango的博客 859

C++11:特殊类设计和四种类型转换

RTTI:Run-time Type identification的简称,即:运行时类型识别。

weixin_51142926的博客 4337

用业务语义织就企业数据之网:SAP Datasphere 的定位、架构与落地场景全解析

SAP Datasphere作为SAP业务数据云的核心组件,通过语义层整合企业内外部数据,支持实时分析与AI应用。其核心功能包括数据集成、语义建模、虚拟化与仓库能力,通过Spaces实现资源隔离,Data Builder和Business Builder分别面向技术和业务建模。该平台与SAP HANA Cloud、SAC等深度集成,支持财务统一分析、供应链可视化等典型场景,并可通过BW bridge实现传统BW资产云化迁移。Datasphere强调开放互联,能与Databricks等生态伙伴协同,为企业提供

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1365

儿童启蒙教育APP

pinyinList.add(createPinyin("a", "啊,像阿姨的阿", R.raw.pinyin_a));pinyinList.add(createPinyin("i", "衣,像衣服的衣", R.raw.pinyin_i));pinyinList.add(createPinyin("u", "乌,像乌鸦的乌", R.raw.pinyin_u));pinyinList.add(createPinyin("ü", "鱼,像小鱼的鱼", R.raw.pinyin_v));-- 固定竖屏 -->

寒寒豆豆软件公司的博客 168

【C++】特殊类设计

本篇文章介绍了五种C++类设计技巧:一、禁止拷贝的类,通过删除拷贝构造函数实现;二、堆上创建对象的类,将析构函数设为非公开并提供静态工厂方法;三、栈上创建对象的类,禁用new和delete;四、禁止继承的类,使用final关键字;五、单例模式的饿汉与懒汉实现。

是阿建吖! 2879

站在评审的角度写国自然基金本子,搭配这5条AI提示词,帮你一键提升本子中标率

多数同仁的选题失败,不是因为你的idea不好,而是你的逻辑没有立起来,你必须让评审看到,你是怎么从问题走向方法的。请你按照“同行做到哪、瓶颈卡在哪、我该怎么破”的逻辑,将我的创新点进行重构:【粘贴你原始的创新点描述】,要求:表达需结构化、可量化、可验证,突出对比后的实质性突破。与其等着评审指出问题,等着本子被拒,不如让AI提前模拟评审,帮你从可行性、创新性、国家价值、团队能力四个维度给你打分,并指出项目的致命破绽,提示词这样设计。创新点如果写不好,本子往往也会被拒,而评审一般喜欢的创新点都是有固定结构的。

智能AI让学术科研更容易 1241

C++之特殊类设计

特殊类的设计:不可被拷贝的类,只能在堆上创建的类,只能在栈上创建的类,不可被继承的类,只能创建一个对象的类(单例)

. 1455

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++特殊类设计

本章我们主要讲解学习特殊类的设计方式。

~ 716

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++中一些特殊类的设计

为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有。

wiketsy的博客 750

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【C++学习】C++特殊类的设计

C++特殊类的设计

2301_77509762的博客 2117

C++特殊类的设计

即可。

supdriver的博客 625

C++ 特殊类的设计

摘要: 本文探讨了C++中特殊类设计的实现方法。首先分析了只能在堆上创建的类,通过私有化构造函数和析构函数实现;其次介绍了栈上创建类的限制方法,包括禁用operator new等技巧。文章还讲解了不能被继承的类(C++98私有构造函数/C++11 final关键字)、不能被拷贝的类的实现方案。最后重点阐述了单例模式的两种实现方式:饿汉模式(提前初始化)和懒汉模式(延迟加载)。全文通过代码示例展示了如何利用C++11特性(=delete、final等)简化特殊类设计,并强调了设计模式在解决特定问题中的价值。

hi0_6的博客 1458

《C++特殊类设计:单例模式》

介绍了C++特殊类的设计以及单例模式

qq_74319491的博客 842
上一篇: 【C++的智能指针】
下一篇: 【C++的类型转换】
和尚爱梳头
博客等级 码龄3年 371粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值