您的位置:首页 > 教育 > 锐评 > 跨境电商b2c是什么意思_达内教育学费价目表_站长之家seo查询_百度广告优化师

跨境电商b2c是什么意思_达内教育学费价目表_站长之家seo查询_百度广告优化师

2025/11/5 6:10:22 来源:https://blog.csdn.net/m0_71927622/article/details/143265196  浏览:    关键词:跨境电商b2c是什么意思_达内教育学费价目表_站长之家seo查询_百度广告优化师
跨境电商b2c是什么意思_达内教育学费价目表_站长之家seo查询_百度广告优化师

设计一个不能被拷贝的类

C++98的方案,让拷贝构造的声明和赋值重载的声明私有化即可。

// c++98
class NoCopy
{// ...
private://仅需要提供声明即可NoCopy(const NoCopy& ncp);NoCopy& operator=(const NoCopy& ncp);
};

C++11的方案是用delete关键字来修饰拷贝构造和赋值重载,表示让编译器删除这两个默认成员函数。

// c++11
class NoCopy
{//...NoCopy(const NoCopy& ncp) = delete;NoCopy& operator=(const NoCopy& ncp) = delete;
};

这个类的价值有如下几个方面,在嵌入式系统或需要与硬件设备交互的软件中,描述硬件设备的对象通常也是不可复制的,因为每个硬件设备都是独一无二的。在网络编程中,代表网络连接或套接字的对象也应该是不可复制的,因为每个连接都是唯一的,并且复制这些对象可能导致不可预测的行为。

设计一个只能在堆区创建对象的类

设计思路一,将析构函数私有,对类外提供一个destroy接口以供释放对象。

在这里插入图片描述
设计思路二,将构造函数私有,对类外提供一个创建堆区对象接口以创建出对象。
在这里插入图片描述

为什么需要设计有只能定义在堆区的类?首先是方便资源管理,假如是该类是一个保存一个文件描述符的类,当定义在栈区时,可能因为作用域结束导致正在执行写入操作的文件描述符被意外关闭。其次是灵活的生命周期控制,可以用智能指针对该类对象进行RAII管理,在不需要的时候就进行自动释放资源。最后还可以保证类的多态性和扩展性。假如该类是某个多态基类的一部分,通过基类指针或引用来操作派生类对象是很常见的做法。在这种情况下,对象通常需要在堆区分配,以实现动态绑定和多态行为。

设计一个只能在栈区创建对象

设计思路如上,将构造函数禁用,然后实现一个对外提供静态方式调用返回对象即可。需要注意的是在类内删除operator new方法,避免在堆上创建该类对象。

这样一个类的价值在于它的内存安全性较高,栈区对象就自动支持RAII特性,无法考虑内存泄漏、空指针等问题的风险。其次是性能方面较优,栈内存分配和释放通常比堆内存更快。保证了代码的确定性,栈上对象的生命周期是确定的,有助于编写更可靠和可预测的代码。

这样需要这样设计类的场景有一些实时系统、嵌入式系统、高频次交易系统。

设计一个无法被继承的类

实现思路分两种,C++98方式,构造函数私有化,对外提供静态方法获取对象。C++11则是用final关键字修饰。
在这里插入图片描述
在这里插入图片描述
设计一个无法被继承的类的价值有如下,保护类实现细节,某些类可能依赖于内部的某种状态或者行为,这些状态或者行为可能无法在派生类内部被正确的维护。通过将类设计为不可继承,可以防止外部代码干扰其内部机制。保证类的唯一性,对于某些设计为单例(Singleton)或具有全局状态的类,继承可能会破坏其唯一性或导致状态不一致。禁止继承可以确保这些类的实例在整个程序中是唯一的。防止滥用,有时候,类的设计者可能不希望用户通过继承来扩展或修改类的行为。禁止继承可以防止用户滥用继承机制,从而保持类的完整性和稳定性。

它的经典应用场景就是单例模式,它是一种常用的设计模式,它确保一个类只有一个实例,并提供全局访问点。为了防止单例类被继承并破坏其唯一性,可以将单例类设计为不可继承。

单例模式

首先介绍一下程序设计模式的概念,程序设计模式是一种被广泛使用的编程方法,它提供了针对软件设计问题的通用解决方案。这些模式是通过重用和组合已知的最佳实践来设计应用程序的,旨在帮助软件开发人员解决特定类型的问题,提高代码的可维护性、可扩展性和重用性。它就像是兵法,兵法是根据战争的经验总结提炼而出的战争的取胜模板。

程序设计模式的起源可以追溯到上世纪80年代,由四位著名的软件工程师艾瑞克·伽玛(Erich Gamma)、理査德·海尔姆(Richard Helm)、拉尔夫·约翰逊(Ralph Johnson)和约翰·威利斯迪斯(John Vlissides)在他们的著作《设计模式:可复用面向对象软件的基础》一书中首次提出了23种设计模式。这些模式被视为一种通用解决方案,可以帮助开发人员解决常见的软件开发问题。

单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式常用于需要控制资源的访问,比如数据库连接、线程池、配置管理等场景。它需要确保一个类只有一个对象,以及提供一个全局的访问接口获取它实例化的对象。

下面先以饿汉模式为例,实现一份demo代码。实现思路如下,首先将构造函数私有化,然后提供一个全局获取单例对象的接口。最后需要进行防拷贝的处理。
在这里插入图片描述
饿汉模式会在main函数开始前,将单例对象创建出来。这么做其实会影响程序加载的效率。如果饿汉模式下的单例对象需要初始化的内容很多的话,程序的加载启动就会非常的慢。这会有一个致命痛点,你也不知道它是在正常加载还是程序已经崩溃。还有一个问题就是,假如有两个单例类,它们的关系是耦合的。即其中一个单例类对象需要依赖另一个单例类对象来初始化它,否则程序会有错误。那么此时饿汉模式无法保证它们的创建先后顺序,因为标准没有规定如何控制静态区成员创建的先后顺序。所以,就得请出下一个单例类的模式,懒汉模式。

如果说饿汉模式是下课铃声一响背起书包往食堂冲刺,那么懒汉模式就是提前点好了外卖悠哉走回宿舍。饿汉模式和懒汉模式实现思路大致一样,懒汉模式的区别是在第一次显示调用获取单例对象接口的时候再去创建单例对象。

在这里插入图片描述
通过定义一个静态的指针变量来维护这个单例,既可以让程序启动速度更快,创建一个4/8字节的静态指针。还可以通过调整获取单例对象接口的顺序,手动控制创建单例类的先后顺序。懒汉模式很好的弥补了饿汉模式无法胜任的场景。当然,通常单例类对象的生命周期是随进程的生命周期,所以无需手动释放内存。假如有特殊的场景需要在生命周期结束后做一些操作,如将数据写入文件。那应该如何实现呢?可以实现将文件操作写入到析构函数中,通过实现一个全局的析构方法来让它delete单例对象指针。而delete 回去调用类的析构让单例类在生命周期结束调用析构函数。为了保证每次都能完成这一操作,我们需要用到一个RAII特性的内部类或者全局类。再这个类的析构方法中取显示调用单例类的全局析构方法,再创建这个类的类对象。这样程序结束,这个类调用析构函数时,会去调用单例类的析构方法来保证每一程序结束都能正常完成数据的文件写入操作。

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com