特殊类设计[上]

文章目录

  • 1.只能在堆上创建对象的类
    • 1.1析构函数私有化
    • 1.2析构函数 = delete
    • 1.3构造函数私有定义+拷贝构造私有只声明
    • 1.4构造函数私有定义+拷贝构造 = delete
  • 2.不能被拷贝的类
    • 2.1 私有声明不定义拷贝构造函数
    • 2. 2拷贝构造函数 = delete
  • 3.只能在栈和静态区创建对象的类
  • 4.不能被继承的类
    • 4.1final关键字
    • 4.2基类构造函数私有化

1.只能在堆上创建对象的类

1.1析构函数私有化

class HeapOnly
{
public:
	void Destroy()
	{
		delete this;
	}
	/*void Destroy()
	{
		delete[] _ptr;
		operator delete(this);
	}*/

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

	int* _ptr;
};
int main()
{
	//HeapOnly ho1;
	//static HeapOnly ho2;

	HeapOnly* pho3 = new HeapOnly;
	pho3->Destroy();

	return 0;
}

1.2析构函数 = delete

class HeapOnly
{
public:
	HeapOnly()
	{
		_str = new char[10];
	}

	~HeapOnly() = delete;

	void Destroy()
	{
		delete[] _str;
		operator delete(this);
	}

private:
	char* _str;
};

int main()
{
	//堆上创建对象
	HeapOnly* ptr = new HeapOnly;
    ptr->Destroy();
    
	//栈上创建对象
	//HeapOnly hp1;
	//数据段上[静态区]创建对象
	//static HeapOnly hp2;
	return 0;
}

1.3构造函数私有定义+拷贝构造私有只声明

//构造函数私有化
class HeapOnly
{
public:
	//设置成静态成员函数的目的 在类外不需生成对象就可调用
	static HeapOnly* CreateObj(int x = 0)
	{
		HeapOnly* p = new HeapOnly(x);
		return p;
	}
private:
	//私有 只声明不实现
	//私有: 类外无法访问创建对象 
	//只声明: 压根就没想让别人用 声明毫无意义
	//不实现: 防止实现了在类内函数拷贝创建
	HeapOnly(int x = 0)
		:_x(x)
	{

	}
	HeapOnly(const HeapOnly& hp);
	HeapOnly& operator=(const HeapOnly& hp);
	int _x = 0;
};

int main()
{
	//HeapOnly ho1;
	//static HeapOnly ho2;
	//HeapOnly* pho3 = new HeapOnly;

	//静态成员函数才能这样访问
	HeapOnly* p1 = HeapOnly::CreateObj(1);
	
	//为防止拷贝构造在栈上创建对象 需要处理拷贝构造
	//HeapOnly p2(*p1);

	return 0;
}

1.4构造函数私有定义+拷贝构造 = delete

//构造函数私有化
class HeapOnly
{
public:
	//设置成静态成员函数的目的 在类外不需生成对象就可调用
	static HeapOnly* CreateObj(int x = 0)
	{
		HeapOnly* p = new HeapOnly(x);
		return p;
	}

	HeapOnly(const HeapOnly& hp) = delete;
	HeapOnly& operator=(const HeapOnly& hp) = delete;
private:
	//私有 只声明不实现
	//私有: 类外无法访问创建对象 
	//只声明: 压根就没想让别人用 声明毫无意义
	//不实现: 防止实现了在类内函数拷贝创建
	HeapOnly(int x = 0)
		:_x(x)
	{

	}
	int _x = 0;
};

int main()
{
	//HeapOnly ho1;
	//static HeapOnly ho2;
	//HeapOnly* pho3 = new HeapOnly;

	//静态成员函数才能这样访问
	HeapOnly* p1 = HeapOnly::CreateObj(1);
	
	//为防止拷贝构造在栈上创建对象 需要处理拷贝构造
	//HeapOnly p2(*p1);

	return 0;
}

2.不能被拷贝的类

上述已经讲述

2.1 私有声明不定义拷贝构造函数

2. 2拷贝构造函数 = delete

3.只能在栈和静态区创建对象的类

class StackOnly
{
public:
	static StackOnly CreateObj(int x = 0)
	{
		return StackOnly(x);
	}
private:
	StackOnly(int x = 0)
		:_x(x)
	{

	}
	int _x;
};

int main()
{
	/*
	StackOnly st1;
	static StackOnly st2;
	StackOnly* st3 = new StackOnly;
	*/

	StackOnly st1 = StackOnly::CreateObj(1);
	static StackOnly st2 = st1;
	return 0;
}

能不能只在栈上创建??? 禁用拷贝构造 启用移动构造

class StackOnly
{
public:
//不能传引用返回   因为StackOnly(x)是个局部对象
	static StackOnly CreateObj(int x = 0)
	{
		return StackOnly(x);
	}

	StackOnly(StackOnly&& st)
		:_x(st._x)
	{
	
	}

private:
	StackOnly(int x = 0)
		:_x(x)
	{
	
	}

	StackOnly(const StackOnly& st) = delete;

	int _x;
};

int main()
{
	/*
	StackOnly st1;
	static StackOnly st2;
	StackOnly* st3 = new StackOnly;
	*/

	StackOnly st1 = StackOnly::CreateObj(1);
	static StackOnly st2 = st1;
	//static StackOnly st2 = move(st1);

	return 0;
}

特殊类设计[上]_第1张图片

貌似可以 接着看

特殊类设计[上]_第2张图片

综上不可以!!!

4.不能被继承的类

4.1final关键字

特殊类设计[上]_第3张图片

4.2基类构造函数私有化

特殊类设计[上]_第4张图片

你可能感兴趣的:(遣返回家的C家家,开发语言,c语言,c++,数据结构)