首页 > 编程语言 >【C++】学习笔记——特殊类的设计

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

时间:2024-08-02 15:58:54浏览次数:20  
标签:Singleton return 笔记 学习 C++ HeapOnly myClass public delete

文章目录


二十二、特殊类的设计

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

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

C++98:

#include <iostream>
using namespace std;

class myClass
{
	// 私有化
	myClass(const myClass& myc);
	myClass& operator=(const myClass& myc);
public:
	myClass()
	{}

	~myClass()
	{}
private:
	int _a;
};

int main()
{
	myClass my1;
	myClass my2(my1);
	my2 = my1;
	return 0;
}

在这里插入图片描述

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

#include <iostream>
using namespace std;

class myClass
{
public:
	myClass()
	{}

	~myClass()
	{}

	myClass(const myClass& myc) = delete;
	myClass& operator=(const myClass& myc) = delete;
private:
	int _a;
};

int main()
{
	myClass my1;
	myClass my2(my1);
	my2 = my1;
	return 0;
}

在这里插入图片描述

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

实现方式:将类的构造函数私有,拷贝构造声明成私有(或delete)。防止别人调用拷贝在栈上生成对象。再提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。

#include <iostream>
using namespace std;

class HeapOnly
{
public:
	static HeapOnly* CreateObject()
	{
		return new HeapOnly;
	}

	HeapOnly(const HeapOnly&) = delete;
private:
	HeapOnly()
	{}
	//HeapOnly(const HeapOnly&);
};

int main()
{
	HeapOnly h;
	HeapOnly* hp = HeapOnly::CreateObject();

	return 0;
}

在这里插入图片描述
在这里插入图片描述

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

同上将构造函数私有化(或delete),然后设计静态方法创建对象返回即可。为了防止使用new来创建堆对象,我们需要手动在类内声明operator new函数,并将其delete掉

#include <iostream>
using namespace std;

class StackOnly
{
public:
	static StackOnly CreateObj()
	{
		return StackOnly();
	}

	void* operator new(size_t size) = delete;
	void operator delete(void* p) = delete;
private:
	StackOnly()
		:_a(0)
	{}
private:
	int _a;
};

int main()
{
	StackOnly s;
	StackOnly* sp = new StackOnly;
	StackOnly s2 = StackOnly::CreateObj();

	return 0;
}

在这里插入图片描述
在这里插入图片描述

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

①将构造函数私有化,派生类中调不到基类的构造函数。则无法继承。
②C++11新关键字 final 修饰的类不能再被继承。

#include <iostream>
using namespace std;

// C++98
class NonInherit
{
public:
private:
	NonInherit()
	{}
};

class A : public NonInherit
{
public:
	A()
	{}
private:
};

// C++11
class B final
{
public:
	B()
	{}
private:
};

class C : public B
{

};

int main()
{
	return 0;
}

在这里插入图片描述

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

一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
一般来说,单例模式有两种实现方式:①饿汉模式 ②懒汉模式
饿汉模式:不管你将来用不用,程序启动时就创建一个唯一的实例对象。

#include <iostream>
using namespace std;

class Singleton
{
public:
	static Singleton* GetInstance()
	{
		return &m_instance;
	}

	Singleton(Singleton const&) = delete;
	Singleton& operator=(Singleton const&) = delete;
private:
	// 构造函数私有
	Singleton()
	{}
	
	// 静态对象--存在静态区,不在对象内
	static Singleton m_instance;
};

// 程序开始时就完成对单例对象的初始化
Singleton Singleton::m_instance;

由于饿汉模式在程序进入主函数前就需要把对象创建出来,如果单例模式太多,或者这个对象太大,则会拖慢程序的启动,对性能要求较高。或者要求对对象的创建顺序有要求,都不适合饿汉模式。
懒汉模式:第一次使用实例对象时,才创建对象。
我们需要判断是否是第一次使用实例,如果是第一次使用实例才创建对象,否则返回原本就存在的对象。

#include <iostream>
using namespace std;

class Singleton
{
public:
	// 创建对象
	static Singleton* GetInstance()
	{
		// 只有第一次调用时,才创建对象
		if (_psint == nullptr)
		{
			// C++98
			_psint = new Singleton;
			return _psint
			
			// C++11
			// static Singleton _psint;
			// return &_psint;
		}

		return _psint;
	}

	Singleton(Singleton const&) = delete;
	Singleton& operator=(Singleton const&) = delete;

private:
	Singleton()
	{}

	// 对象指针
	static Singleton* _psint;
};

// 初始化
Singleton* Singleton::_psint = nullptr;

未完待续

标签:Singleton,return,笔记,学习,C++,HeapOnly,myClass,public,delete
From: https://blog.csdn.net/m0_69828905/article/details/140825538

相关文章

  • 【C++庖丁解牛】C++特殊类设计 | 单例模式
    ......
  • Pytorch笔记|小土堆|P10-13|transforms
    transforms对图像进行改造最靠谱的办法:根据help文件自行学习transforms包含哪些工具(类)以及如何使用————————————————————————————————————自学一个类时,应关注:1、如何使用各种工具(类)的使用思路:创建对象(实例化)——>传入参数,调用函数(如有__......
  • 让C++通过JNI来callback回调kotlin侧代码
    kotlin一次通过jni调用C++侧,然后C++侧多次回传数据让C++通过JNI来callback回调kotlin侧代码1.定义Kotlin接口在Kotlin中定义一个用于接收C++回调的接口:interfaceDataCallback{funonDataReceived(data:String)}2.定义C++侧的JNI方法在C++侧,实现接收指令和......
  • 学习C语言的第4天--运算符与流程控制
    今日目标了解各种运算符及其用法。掌握条件语句和循环语句的使用。每日练习目录今日目标运算符1.算术运算符2.关系运算符3.逻辑运算符4.位运算符5.赋值运算符6.其他运算符条件运算符(三元运算符)指针运算符逗号运算符流程控制1.条件语句if语句if-else语句......
  • Qt C++ 调用 Python 之 PyObject* 数据类型转换
    整数:PyLong_FromLong和PyLong_AsLong类型检查函数:PyLong_Check()intcppInt=42;//C++整数转换为Python整数对象PyObject*pyInt=PyLong_FromLong(cppInt);//Python整数对象转换为C++整数longcppIntFromPy=PyLong_AsLong(pyInt);Py_DECREF(pyInt)......
  • Hive学习第十天--函数的用法结尾
    Hive自定义函数UserDefineFunction主要分为三大类:​ UDF:一对一​ UDTF:一对多​ UDAF:多对一注意:1、区分的条件只要看前后输入输出之后的行数的变化​ 2、UDF可以连续嵌套调用,类似于if语句UDF:一进一出定义UDF函数要注意下面几点:继承org.apache.hadoop.hive.ql.ex......
  • 【笔记】计数选讲:容斥、LGV、集合幂级数、GF 2024.8.2
    今天写的很乱。[HEOI2013]SAO容斥。因为我们已经知道父亲\(<\)儿子时的情况(\(n!/\prod_isiz_i\),也适用于森林),那么儿子\(<\)父亲的情况就容斥掉,无限制的就当作那条边不存在。树上背包,记录当前节点为根的连通块大小和容斥系数的积。*[ECFinal23A]DFSOrder4转写为:统计多......
  • STM32简介及学习方向
    目录1.STM32简介2.STM32与ARM的关系3.STM32F103C8T6介绍3.1STM分类3.2STM命名规则3.3项目开发介绍3.4STM32F103C8T6芯片3.4.1芯片外观3.4.2 引脚图 3.4.3引脚对应功能表 3.4.4 STM32F103系列芯片的系统架构 3.4.5 STM32F103系列芯片总线矩阵(不含......
  • c++ 从txt读取数据gnss转化为enu数据
    https://github.com/Dongvdong/gnss_ecef_enu_txt_yaml  测试文件config.yaml#==============##CameraModel##==============#Camera.name:EH2022leftmonocularCamera.setup:monocularCamera.model:perspectiveCamera.fx:1220Camera.fy:1220Camera.cx:......
  • 基于SpringBoot的智能购房推荐系统-09040(免费领源码)可做计算机毕业设计JAVA、PHP、爬
    Springboot智能购房推荐系统摘 要近年来随着我国经济的高速发展,房地产业也随之蓬勃发展,尤其是最近国家新出台的房改政策。鼓励居民购房,这对房产公司无疑是一个极好的发展势头。尤为重要的是,近几年随着信息技术和电子商务的快速发展,许多企业都开发了自己房产信息软件。智......