c++学习(特殊类设计)[30]

这篇具有很好参考价值的文章主要介绍了c++学习(特殊类设计)[30]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

只能在堆上创建对象的类

如果你想要确保对象只能在堆上创建,可以通过将析构函数声明为私有,并提供一个静态成员函数来创建对象。这样,类的实例化只能通过调用静态成员函数来完成,而无法直接在栈上创建对象。

以下是一个示例:

class HeapOnlyClass {
private:
    HeapOnlyClass() {} // 私有的构造函数,防止在栈上创建对象
    ~HeapOnlyClass() {} // 私有的析构函数

public:
    static HeapOnlyClass* createInstance() {
        return new HeapOnlyClass();
    }
};

int main() {
    // 无法在栈上创建对象
    // HeapOnlyClass obj;

    // 只能通过静态成员函数创建对象
    HeapOnlyClass* obj = HeapOnlyClass::createInstance();

    // 使用对象...

    delete obj; // 释放堆上的对象

    return 0;
}

在上面的示例中,HeapOnlyClass 类的构造函数和析构函数都被声明为私有。这意味着在类的外部无法直接创建对象或销毁对象。

通过提供一个静态成员函数 createInstance(),我们可以在堆上创建对象。静态成员函数返回一个指向 HeapOnlyClass 对象的指针。在 main() 函数中,我们使用 createInstance() 函数来创建对象,并在使用完对象后通过 delete 关键字释放对象。

这样,我们就可以确保对象只能在堆上创建,而无法在栈上创建。

只能在栈上创建对象的类

如果你想要确保对象只能在栈上创建,可以将类的构造函数声明为私有,并提供一个静态成员函数来创建对象。这样,类的实例化只能通过调用静态成员函数来完成,而无法直接在堆上创建对象。

以下是一个示例:

class StackOnlyClass {
private:
    StackOnlyClass() {} // 私有的构造函数,防止在堆上创建对象

public:
    static StackOnlyClass createInstance() {
        return StackOnlyClass();
    }
};

int main() {
    // 无法在堆上创建对象
    // StackOnlyClass* obj = new StackOnlyClass();

    // 只能通过静态成员函数创建对象
    StackOnlyClass obj = StackOnlyClass::createInstance();

    // 使用对象...

    return 0;
}

在上面的示例中,StackOnlyClass 类的构造函数被声明为私有。这意味着在类的外部无法直接创建对象。

通过提供一个静态成员函数 createInstance(),我们可以在栈上创建对象。静态成员函数返回一个 StackOnlyClass 对象。在 main() 函数中,我们使用 createInstance() 函数来创建对象,并在使用完对象后,对象会自动被销毁。

这样,我们就可以确保对象只能在栈上创建,而无法在堆上创建。

单例模式(一个类之只能创建一个对象)

c++学习(特殊类设计)[30],C++,c++,学习
c++学习(特殊类设计)[30],C++,c++,学习
单例模式可以通过懒汉模式和饿汉模式来实现。下面我将为你解释这两种方式的实现。

  1. 懒汉模式:
    懒汉模式是指在需要获取实例时才会创建对象。实现懒汉模式的关键是延迟实例化,即在第一次调用获取实例的方法时才创建对象。
class LazySingleton {
private:
    static LazySingleton* instance;

    LazySingleton() {} // 私有构造函数

public:
    static LazySingleton* getInstance() {
        if (instance == nullptr) {
            instance = new LazySingleton();
        }
        return instance;
    }
};

LazySingleton* LazySingleton::instance = nullptr;

在上面的示例中,LazySingleton 类的构造函数被声明为私有,无法直接实例化对象。通过静态成员变量 instance 来保存类的唯一实例,并在 getInstance() 方法中进行延迟实例化。如果 instancenullptr,则创建一个新的 LazySingleton 对象。如果 instance 不为 nullptr,则直接返回现有的实例。

  1. 饿汉模式:
    饿汉模式是指在类加载时就创建对象,无需延迟实例化。实现饿汉模式的关键是在类定义中直接创建对象,并提供一个静态方法来获取这个实例。
class EagerSingleton {
private:
    static EagerSingleton* instance;

    EagerSingleton() {} // 私有构造函数

public:
    static EagerSingleton* getInstance() {
        return instance;
    }
};

EagerSingleton* EagerSingleton::instance = new EagerSingleton();

在上面的示例中,EagerSingleton 类的构造函数被声明为私有,无法直接实例化对象。通过静态成员变量 instance 在类定义中直接创建 EagerSingleton 对象。在 getInstance() 方法中,直接返回这个已经创建好的实例。

懒汉模式和饿汉模式都可以实现单例模式,但它们的区别在于实例化的时机。懒汉模式在第一次调用获取实例的方法时才创建对象,而饿汉模式在类加载时就创建对象。

懒汉模式和饿汉模式各有优点和缺点,下面我将为你详细解释。

懒汉模式的优点:

  1. 延迟实例化:懒汉模式在需要获取实例时才会创建对象,可以避免不必要的资源消耗。如果实例化对象的过程比较耗时,懒汉模式可以提高性能。
  2. 线程安全(加锁):在多线程环境下,懒汉模式可以通过加锁来保证只有一个线程能够创建实例。这样可以避免多个线程同时创建多个实例的问题。

懒汉模式的缺点:

  1. 线程安全(加锁):虽然懒汉模式可以通过加锁来保证线程安全,但是加锁会引入额外的开销,降低性能。
  2. 可能存在资源竞争:在多线程环境下,如果有多个线程同时判断实例为空,然后同时创建实例,就会导致资源竞争的问题。

饿汉模式的优点:

  1. 简单直观:饿汉模式在类加载时就创建了实例,不需要进行延迟实例化的逻辑,代码相对简单。
  2. 线程安全:在类加载时就创建了实例,因此不会存在多个线程同时创建实例的问题。

饿汉模式的缺点:

  1. 提前实例化:饿汉模式在类加载时就创建了实例,如果这个实例在后续的程序中没有被使用,就会造成资源的浪费。
  2. 无法处理异常:在饿汉模式下,如果在创建实例的过程中发生异常,无法通过捕获异常来处理,因为实例的创建是在类加载时进行的。

综上所述,懒汉模式适用于需要延迟实例化的场景,可以避免不必要的资源消耗;而饿汉模式适用于实例创建比较简单且在后续程序中会被使用的场景,可以保证线程安全。文章来源地址https://www.toymoban.com/news/detail-628765.html

到了这里,关于c++学习(特殊类设计)[30]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】特殊类的设计

    💕 C++98方式: 在C++11之前,想要一个一个类不被拷贝,只有将 拷贝构造函数 定义为私有,这样在类外就不能调用拷贝构造函数来构造对象了。但是在类内还是可以调用拷贝构造函数来构造对象。 所以正确的做法是 将拷贝构造函数定义为私有,同时拷贝构造函数只声明,不

    2024年02月07日
    浏览(39)
  • C++语法(26)--- 特殊类设计

    C++语法(25)--- 异常与智能指针_哈里沃克的博客-CSDN博客 https://blog.csdn.net/m0_63488627/article/details/131537799?spm=1001.2014.3001.5501   目录 1.特殊类设计 1.设计一个类,不能被拷贝 C++98 C++11 2.设计一个类,只能在堆上创建对象 1.封掉所有拷贝 C++98 C++11 2.封掉析构函数 3.设计一个类,只能

    2024年02月15日
    浏览(64)
  • C++进阶(十六)特殊类设计

    📘北尘_ :个人主页 🌎个人专栏 :《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 拷贝只会放生在两个场景中: 拷贝构造函数以及赋值运算符重载 ,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运

    2024年02月19日
    浏览(32)
  • 【高级程序设计语言C++】特殊类设计

    拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 用C++11的话,可以使用特殊的语法来实现一个不能被拷贝的类。在C++11中,可以使用删除函数(deleted function)来禁用拷

    2024年02月10日
    浏览(48)
  • C++进阶 特殊类的设计

    本篇博客介绍:介绍几种特殊的类 我们的拷贝只会发生在两个场景当中 拷贝构造函数 赋值运算符重载 所以说我们只需要让类失去 或者说不能使用这两个函数即可 这里有两个解决方案 在C++98中 我们将拷贝构造函数只声明不定义 并且将其访问权限设置为私有即可 原因如下

    2024年02月12日
    浏览(39)
  • C++特殊类设计及类型转换

    目录 一、特殊类的设计 1.不能被拷贝的类 2.只能在堆区构建对象的类 3.只能在栈区构建对象的类 4.不能被继承的类 二、单例模式 1.饿汉模式 2.懒汉模式 3.线程安全 4.单例的释放 三、C++类型转换 1.C语言的类型转换 2.static_cast 3.reinterpret_cast 4.const_cast 5.dynamic_cast 6.总结 特殊类就

    2024年02月17日
    浏览(43)
  • 【C++】特殊类设计(单例模式)

    设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 根本原因是为了代码复用,增加可维护性。 设计模式的例子:迭代器模式 拷贝一共就只有两个场景,一

    2023年04月22日
    浏览(54)
  • C++之特殊类的设计

    目录 一、单例模式 1、设计模式 2、单例模式 1、饿汉模式 2、懒汉模式 3、单例对象的释放问题 二、设计一个不能被拷贝的类 三、设计一个只能在堆上创建对象的类 四、设计一个只能在栈上创建对象的类 五、设计一个不能被继承的类 概念: 设计模式(Design Pattern)是一套被

    2024年02月08日
    浏览(42)
  • 【C++修炼之路】33.特殊类设计

    每一个不曾起舞的日子都是对生命的辜负 掌握常见特殊类的设计方式 拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C++98 将拷贝构造函数与赋值运算符重载只声明不

    2024年02月13日
    浏览(49)
  • C++特殊类设计(单例模式)

    C++98 将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可。 原因: 设置成私有:如果只声明没有设置成private,用户自己如果在类外定义了,就可以不能禁止拷贝了 只声明不定义:不定义是因为该函数根本不会调用,定义了其实也没有什么意义

    2024年01月19日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包