特殊类设计

文章讨论了如何通过私有化构造函数、拷贝构造函数和赋值运算符,以及使用析构函数和operatordelete,实现类只能在特定区域(堆或栈)创建,并防止继承和复制。提供了三种方案:私有化拷贝/赋值、析构函数私有化和构造函数私有化.
摘要由CSDN通过智能技术生成

1.请设计一个类,不能被拷贝
拷贝只会放生在两个场景中:拷贝构造函数赋值运算符重载
c++98
将拷贝构造函数与赋值运算符重载只声明不定义并且将其访问权限设置为私有即可

class Copyban{
  Copyban(const Copyban&);
  Copyban operator=(const Copyban&);
 }

①.设置成私有:如果只声明没有设置成private,用户自己在类外定义了,就可以不能禁止拷贝了
②.只声明不定义:不定义是因为该函数根本不会调用吗,定义了没意义,而且如果定义了就不会防止成员函数内部拷贝了
C++1
C++11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上=delete,表示让编译器删除掉该默认成员函数。

class CopyBan
{
    CopyBan(const CopyBan&)=delete;
    CopyBan& operator=(const CopyBan&)=delete;
};

2.设计一个类,只能在堆上创建对象
方案一:析构函数私有化

class Heaponly{
static void Destroy(Heaponly*ptr){
     delete ptr;
}
void Destroy{
   delete this;
}
private:
~Heaponly(){
}
}
int main(){
    Heaponly*ptr=new Heaponly;
    Heaponly::destroy(ptr);
 //  ptr->destroy();
 }

我们可以将析构函数私有化,因为在栈上和静态区的对象需要自动调用析构函数,而析构函数无法显示调用了,就会导致我们无法在栈上和静态区创建对象。
 因为堆上的对象是需要我们手动的创建和删除的,所以在堆上创建对象只先调用构造函数; 如果我们需要对堆上创建的对象进行销毁,我们可以提供一个公有函数接口,用这个函数接口调用私有函数。

方案二:构造函数私有化

class Heaponly{
    public:
        static Heaponly*createObj(){
          return new HeapOnly;
       }
       Heaponly(const Heaponly&hp)=delete;
       Heaponly&operator=(const Heaponly&hp)=delete;
     private:
        Heaponly(){
        } 
}
int main(){
     Heaponly*ptr=Heaponly:createObj();
     
}

我们将构造函数私有,禁止任何方式创建示例。但是提供一个可以在堆上创建对象的公有函数,这样我们就可以通过公有函数来调用私有的构造函数。这里的要创建对象的公有函数应该是static修饰的,因为如果要调用公有函数,需要有一个对象示例,而我们要用公有函数创建一个示例,而我们现在没有对象示例,需要调用公有函数(类似鸡生蛋,蛋生鸡)…如果函数在静态区,就可以直接调用了。同时,为了防止我们创建的对象示例被拷贝构造或者赋值,所以我们还需要将拷贝构造函数和赋值运算符重载函数封死。

3.设计一个类,只能在栈上创建对象
构造函数私有化

class StackOnly
{
public:
	static StackOnly CreateObj()
	{
		StackOnly st;
		return st;
	}
private:
	StackOnly()
	{
	}
	//对一个类实现专属的operator new
	//如果对一个类实现一个专属的operator new,那么会调这个
	void* operator new(size_t size) = delete;
};

int main()
{
	StackOnly hp3 = StackOnly::CreateObj();
	StackOnly copy(hp3);
}

4.设计一个类、不能被继承
  C++98
  我们将构造函数私有化,派生类中调不到基类的构造函数,则无法继承。

class NonInherit
{
public:
	static NonInherit GetInstance()
	{
		return NonInherit();
	}
private:
	NonInherit()
	{
	}
}
C++11  final
class A final
{
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值