C++之特殊类设计

03-09 1195阅读

设计一个不能被拷贝的类

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

C++98

将拷贝构造函数与赋值运算符重载只声明不定义且将其访问权限设置为私有即可:

class banCopy
{
public:
	banCopy()
	{}
private:
	banCopy(const banCopy& a);
	banCopy& operator=(const banCopy& a);
};

1. 只声明不定义: 只声明是因为拷贝构造和赋值重载都是默认成员函数, 用户不写编译器会自动生成, 不定义是因为该函数根本不会被调用, 定义了其实也没有什么意义, 而且如果定义了就不能防止成员函数内部的拷贝.

2. 设置成私有是为了防止, 如果只声明不定义但没有设置私有, 但用户自己在类外定义了这两个函数, 依然可以调用这两个函数, 而设置为私有即使自己类外定义了也无法调用.

banCopy::banCopy(const banCopy& a)
{
	//假如类外实现拷贝构造
	//..
}

C++之特殊类设计

仍然无法被拷贝 

C++11

C++11扩展delete的用法, 如果在默认成员函数后加上=delete, 表示让编译器删除掉该默认成员函数, 从根本上杜绝了拷贝的发生:

class banCopy
{
private:
	banCopy(const banCopy& a) = delete;
	banCopy& operator=(const banCopy& a) = delete;
};

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

方法一: 析构函数私有化

C++是一个静态绑定的语言。在编译过程中,所有的非虚函数调用都必须分析完成。即使是虚函数, 也需检查可访问性。因此,  当在栈上生成对象时, 对象会自动析构, 也就说析构函数必须可以访问, 否则编译出错。而在堆上生成对象, 由于析构函数由程序员调用(通过使用delete), 所以不一定需要析构函数。

class heapOnly
{
private:
	~heapOnly()
	{
		cout 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]