上饶市建设局培训网站哪个网站可以免费建站啊免费建网站
- 作者: 五速梦信息网
- 时间: 2026年03月21日 09:23
当前位置: 首页 > news >正文
上饶市建设局培训网站,哪个网站可以免费建站啊免费建网站,西安网站建设需要多少钱,网站建设内容存储目录
序言
#xff08;一#xff09;设计一个不能被拷贝的类
#xff08;二#xff09;设计一个只能在堆上创建对象的类
#xff08;三#xff09;设计一个只能在栈上创建对象的类
#xff08;四#xff09;设计一个不能被继承的类
总结 序言
特殊类设计是指在面…
目录
序言
一设计一个不能被拷贝的类
二设计一个只能在堆上创建对象的类
三设计一个只能在栈上创建对象的类
四设计一个不能被继承的类
总结 序言
特殊类设计是指在面向对象编程中根据特定需求或情况创建具备特殊功能或属性的类。特殊类设计旨在解决特定问题或满足特殊需求使代码更加灵活和可扩展。 一设计一个不能被拷贝的类 拷贝只会放生在两个场景中拷贝构造函数以及赋值运算符重载因此想要让一个类禁止拷贝只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 接下来我们分别从C98和C11的两种场景去看二者是如何实现
【C98】将拷贝构造函数与赋值运算符重载只声明不定义并且将其访问权限设置为私有即可 代码如下
class CopyBan
{
private:CopyBan(const CopyBan); // 声明拷贝构造函数为私有CopyBan operator(const CopyBan); // 声明拷贝赋值运算符为私有public:CopyBan() {} // 默认构造函数
};【解释说明】
设置成私有如果只声明没有设置成private用户自己如果在类外定义了就可以不能禁止拷贝了只声明不定义不定义是因为该函数根本不会调用定义了其实也没有什么意义不写反而还简单而且如果定义了就不会防止成员函数内部拷贝了。
使用该类时只需简单地继承它即可
class MyClass : public CopyBan{// 类的定义
}; 【C11】C11扩展delete的用法delete除了释放new申请的资源外如果在默认成员函数后跟上delete表示让编译器删除掉该默认成员函数。
代码如下
class CopyBan
{//…..CopyBan(const CopyBan) delete; // 删除拷贝构造函数CopyBan operator(const CopyBan) delete; // 删除拷贝赋值运算符//…..
};【解释说明】
在上面的示例中我们定义了一个名为 CopyBan 的类。通过将拷贝构造函数和拷贝赋值运算符声明为 delete 我们禁用了对象的拷贝功能这样一来任何试图拷贝 CopyBan 类型对象的操作都会在编译时引发错误。 同样的使用该类时只需简单地继承它即可
class MyClass : public CopyBan{// 类的定义
};
在这个示例中MyClass 继承了CopyBan 类。但是由于基类CopyBan 禁用了拷贝构造函数和赋值运算符函数所以无法对 MyClass 进行拷贝操作。 【小结】
使用这种设计你可以确保该类的实例不会被拷贝从而避免不必要的对象复制和可能引发的错误。 二设计一个只能在堆上创建对象的类 实现方式 将类的构造函数私有拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。 提供一个静态的成员函数在该静态成员函数中完成堆对象的创建。 【C98】
代码如下
class HeapOnly
{
public:static HeapOnly* CreateObject(){return new HeapOnly();}
private:HeapOnly() {} // 私有化默认构造函数// C98// 1.只声明,不实现。因为实现可能会很麻烦而你本身不需要// 2.声明成私有HeapOnly(const HeapOnly);
};【C11】
代码如下
class HeapOnly
{
public:static HeapOnly* CreateObject(){return new HeapOnly();}
private:HeapOnly() {} // 私有化默认构造函数// C11HeapOnly(const HeapOnly) delete;
}; 【解释说明】
在 C11 标准之后可以使用 delete 来删除复制构造函数而不仅仅是将其声明为私有这种方式更加清晰明了使得代码更具可读性和表达性。因此推荐使用 C11 及以上版本的标准来实现这样的需求。 这样你就可以使用下面的代码在堆上创建 HeapOnly 类对象
HeapOnly* obj HeapOnly::CreateObject();
请确保在使用完对象后手动调用 delete 来释放内存
delete obj; 【小结】
这样设计的类将只能在堆上创建对象并且无法通过拷贝或赋值的方式创建新对象从而确保了对象的唯一性和创建方式的约束。 三设计一个只能在栈上创建对象的类 实现方法 要设计一个只能在栈上创建对象的类可以使用私有的析构函数和公有的静态成员函数来实现。 【C98】
代码如下
class StackOnly
{
public:static StackOnly CreateObj() {return StackOnly();}private:StackOnly() {} // 私有化默认构造函数~StackOnly() {} // 私有化析构函数
};【解释说明】
在上面的示例中我们将默认构造函数和析构函数私有化。这意味着外部无法直接实例化或销毁 StackOnly 类的对象。为了能够创建对象我们提供了一个名为 CreateObj 的公有静态成员函数。该函数返回一个 StackOnly 类型的对象。
使用代码示例
StackOnly obj StackOnly::CreateObj();这样就确保了 StackOnly 类的对象只能在栈上创建因为无法直接访问私有的默认构造函数;对象的析构由编译器自动处理(不需要手动调用delete释放内存)当对象超出作用域时会自动调用析构函数进行资源的释放。 【C11】可以使用删除特殊成员函数以及阻止使用new和delete操作符的方式来实现只能在栈上创建对象的类。
代码如下
class StackOnly
{
public:StackOnly() default; // 允许默认构造函数// 删除拷贝构造函数和赋值运算符函数StackOnly(const StackOnly) delete;StackOnly operator(const StackOnly) delete;// 禁止使用new和delete操作符void* operator new(size_t) delete;void operator delete(void) delete;
};
使用代码示例
StackOnly obj1; // 在栈上创建对象// 下面的代码将导致编译错误因为拷贝构造函数被删除
// StackOnly obj2 obj1;// 下面的代码将导致编译错误因为赋值运算符函数被删除
// StackOnly obj3;
// obj3 obj1;// 下面的代码将导致编译错误因为使用了删除的new运算符
// StackOnly ptr new StackOnly;// 下面的代码将导致编译错误因为使用了删除的delete运算符
// delete ptr;
【解释说明】
这样设计的类将只能在栈上创建对象并且无法通过拷贝或赋值的方式创建新对象同时禁止使用new和delete来分配和释放对象的内存从而确保了对象的唯一性和创建方式的限制。 除了上述方法之外还有一种比较奇特的方式可以用于实现只能在栈上创建对象的类。这种方式是通过定义一个私有化的 operator new 和 operator delete 函数来实现无需删除构造函数和析构函数。 代码如下
class StackOnly
{
public:// 在 public 区域声明 operator new 和 operator delete 函数static void* operator new(size_t size) delete; // 删除 operator new 函数static void operator delete(void* ptr) noexcept delete; // 删除 operator delete 函数private:// 私有化所有构造、析构函数包括默认构造函数StackOnly() {}StackOnly(const StackOnly) {}~StackOnly() {}
};【解释说明】
在上面的示例中将构造函数和析构函数都设为了私有的防止对象在堆上创建或销毁。同时我们在公有区域声明了一个删除的 operator new 和 operator delete 函数这些函数用于在堆上分配内存和释放内存。由于默认情况下类的 operator new 和 operator delete 函数都是 public 的因此我们要重新定义它们。而将其声明为 delete则完全禁止直接在堆上分配和释放内存从而避免对象在堆上创建。 使用该类时只能通过栈上的对象进行操作
StackOnly obj;【注意】
确保了 StackOnly 类的对象只能在栈上创建。但是这种方法需要注意的是在某些情况下可能会因为需要使用 operator new 和 operator delete 函数而无法编译通过因此使用时需要慎重考虑。 四设计一个不能被继承的类 实现方法 在使用 C98 标准时可以通过将构造函数和析构函数设为私有并且不提供公共的静态工厂方法来实现一个不能被继承的类。 【C98】
代码如下
class NonInherit
{
private:NonInherit() {}~NonInherit() {}public:// 禁止通过静态工厂方法创建对象static NonInherit* GetInstance() {return NULL;}
}; 实现方法 在C11以及后续的标准中你可以在类声明的末尾添加关键字final来显式地指示该类是不可被继承的。 【C11】
代码如下
class A final
{// ….
};
【解释说明】
在上述示例中我们在类的定义前使用了 final关键字将 A声明为最终类。这意味着其他类无法从A继承。如果其他类尝试继承 A编译器将会报错。 例如
class A final
{//…
};class B : public A { // 编译错误// 类定义
};
报错如下 总结 这些特殊类的设计目的是根据特定的需求和编程场景来确定的
它们有助于代码的组织、可维护性、可扩展性和重用性。通过合理地设计和使用这些特殊类可以提高代码的质量、可读性和可靠性。 到此关于本期特殊类设计便讲解结束了。感谢大家的观看和支持
- 上一篇: 上那个网站找手工活做淮阳住房和城乡建设局网站
- 下一篇: 上饶网站建设哪家好线上营销技巧和营销方法
相关文章
-
上那个网站找手工活做淮阳住房和城乡建设局网站
上那个网站找手工活做淮阳住房和城乡建设局网站
- 技术栈
- 2026年03月21日
-
上门做网站哪家好互联网黄页是什么
上门做网站哪家好互联网黄页是什么
- 技术栈
- 2026年03月21日
-
上门做美容的网站wordpress添加ico
上门做美容的网站wordpress添加ico
- 技术栈
- 2026年03月21日
-
上饶网站建设哪家好线上营销技巧和营销方法
上饶网站建设哪家好线上营销技巧和营销方法
- 技术栈
- 2026年03月21日
-
上饶网站建设哪家好校园网站 建设 意义
上饶网站建设哪家好校园网站 建设 意义
- 技术栈
- 2026年03月21日
-
上市公司网站建设网站建设公司问答营销案例
上市公司网站建设网站建设公司问答营销案例
- 技术栈
- 2026年03月21日

