禁止在栈中初始化的类【2】

用8x8点阵屏和矩阵按键DIY复古掌机:从零复刻贪吃蛇的完整避坑指南 本文详细介绍了如何使用8x8 WS2812B点阵屏和4x4矩阵按键,基于51单片机DIY复古贪吃蛇掌机的完整流程。从硬件选型、驱动优化到游戏逻辑实现,提供了全面的避坑指南和性能优化技巧,帮助电子爱好者快速掌握嵌入式系统开发的核心技术。 阅读详情

    将构造和析构设置为private,即可禁止栈中实例化。如果用protected,则可以被继承。

   

// 禁止在栈中实例化。那就只有在堆中实例化喽?
// 在栈中实例化需要干嘛呢?构造和析构。将其中之一设为private即可。
// 然后就是单件模式的套路了~在成员函数中提供接口,执行new和delete操作。
// PS:将构造和析构设计为私有,同时也就禁止了继承。
// 但是如果设计为protected可以实现继承,不过会不会留下隐患?子类可以使用共有构造和析构函数,这样可以拥有父类的行为
#include <iostream>
using namespace std;

class S   // 标准单件模式1
{
public:
    static S* get_instance()
    {
        if(sp) return sp;
        else   return (sp=new S);
    }
    void print(){cout<<"It is S"<<endl;}
    void destroy()
    {
        delete this;
    }
private:
    static S*sp;
    S(){cout<<"S::ctor"<<endl;}
    ~S(){cout<<"S::dector"<<endl;}
};

S* S:: sp=0;

class S2   // 标准单件模式2
{
public:
    static S2* get_instance()
    {
        static S2 s;
        return &s;
    }
    void print(){cout<<"It is S2"<<endl;}
    void destroy()
    {
        ;
    }
private:
    S2(){cout<<"S2::ctor"<<endl;}
    ~S2(){cout<<"S2::dector"<<endl;}
};

// 构造和析构声明为protected,这样禁止在栈中构造,但是不影响继承。
class Parent
{
public:
    void print(){cout<<"It is Parent"<<endl;}

protected:

    Parent(){cout<<"Parent::ctor"<<endl;}
    ~Parent(){cout<<"Parent::dector"<<endl;}
};


class child:public Parent   // child中除了共有的构造和析构以外什么也没有
{
public:
    child(){cout<<"child::ctor"<<endl;}    
    ~child(){cout<<"child::dector"<<endl;}    
};
int main()
{
    {
        S*p= S::get_instance();  // 用指针的单件模式
        p->print();
        p->destroy();
    }
    cout<<endl<<endl;
    {
        S2*p= S2::get_instance();  //用static变量的单件模式
        p->print();

    }   
    cout<<endl<<endl;
    
    child chld;                   // 继承之后,等效于在栈中实例化了Parent
    Parent &rp=chld;
    rp.print();
    return 0;
}

chen@chen-book1:~$ g++ heap_only.cpp -o heaponly
chen@chen-book1:~$ ./heaponly 
S::ctor
It is S
S::dector


S2::ctor
It is S2


Parent::ctor
child::ctor
It is Parent                  // !!!!
child::dector
Parent::dector
S2::dector
chen@chen-book1:~$ 



c++类、结构体、堆、栈及函数调用 在C++中,类和结构体的初始化方式有一些不同。 阅读详情

相关推荐

函数栈深入解析(2) - Golang语言函数栈

深度剖析Go语言函数栈技术。

1471

C++ 单例模式和禁止在栈中创建实例

在C++中,禁止在栈中

Black—Horse的专栏 1096

第二十三节 C++ 如何禁止在栈中实例化类

有时需要在堆中创建对象,禁止在栈中去创建,1 可以将析构函数定义为private成员2 建立static函数成员去delete这个堆空间/* Human.h */ #include &lt;string&gt; /* * 为了禁止某些类在栈中创建,措施之一是将析构函数定义为private * 这样在函数使用完对象,并对其销毁时将出现错误,因为不能在外部调用析构函数 * 这种方式,堆内...

菜鸟博客 1000

实例化类,怎么限制只能在堆或栈分配!

昨天一个同学去网易面试C++研发,问到了这么一个问题:如何限制一个类对象只在栈(堆)上分配空间? 一般情况下,编写一个类,是可以在栈或者堆分配空间。但有些时候,你想编写一个只能在栈或者只能在堆上面分配空间的类。这能不能实现呢?仔细想想,其实也是可以滴。 在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;这两种方式是有区别的。 1、静态建立

《我是你的正能量》 1190

STM32 USART高级功能全解析:IrDA、DMA、硬件流控与低功耗唤醒

USART是嵌入式系统中最基础的串行通信外设,其核心原理在于同步/异步时序控制与数据帧收发机制。现代MCU如STM32通过深度集成IrDA调制解调、DMA直传通道、RS232/RS485硬件流控及Stop模式唤醒等扩展能力,显著提升通信可靠性、吞吐效率与能效比。其中,IrDA SIR采用RZI编码实现抗干扰红外传输,DMA通过TXE/RXNE事件驱动实现零CPU干预的连续数据流,而硬件流控(RTS/CTS/DE)和低功耗唤醒(WUF+UESM)则分别保障工业现场鲁棒性与电池级超长待机。本文围绕STM32平台

weixin_28922227的博客 211

绝缘检测原理和绝缘电阻计算方法

绝缘检测的目的就是计算绝缘电阻,当绝缘电阻低于某个阈值,则很可能会造成电池短路、漏电,威胁人员安全

m0_56208280的博客 4万+

java禁止类初始化_java类初始化

我们经常需要使用单例模式来为我们工作,而我们一般会使用下面的代码来组织我们的单例模式: 我们称这样的代码为“双重检查锁定”(Double checking locking),一般情况下,这样的代码不会出现什么问题,毕竟我们的代码中也有类似的代码,但是这样的代码还是会有安全隐患。在这里,我们需要了解一个“new SingletonClass()”背后的过程,新生成一个对对象需要三个过程:1.jvm堆...

weixin_42553588的博客 295

sldd数据字典导出为excel

sldd导出为excel

zpfjf的博客 2237

java禁止类初始化_关于 Java 中类的初始化顺序的问题

突然思考到这个问题,就想做点实验理清楚一下。1. 单个类的初始化class Foo {static {// [1]}static Foo2 obj = new Foo2(); // [3]Foo2 obj2 = new Foo2(); // [4]public Foo() {// [5]}}class Foo2 {static {// [2]}}如上面代码所示,加载顺序如备注标记的一样。先加载这个...

weixin_27676369的博客 187

【AGC】【serverless】【云函数】云函数常见问题

1、云函数添加了AUTH触发器后,在用户执行注册、销户、登录、登出动作时,云函数的event对象会自动触发返回相应信息。比如我在“层”的压缩包里放了config/config.txt,那么我在云函数里怎么调用这个文件?层的目录是:/dcache/layer,函数的目录是/dcache/layer/func。在云函数里往云数据库里插入数据返回的是180000,这是正常吗?已经按照文档在后台对应的云函数里配置了,所需的AUTH触发器。层的用法和放在函数里的用法是相同的。云函数里的层如何调用?

华为开发者联盟 839

FPGA远程更新实战:Multiboot双镜像配置与Flash分区策略

本文详细介绍了FPGA远程更新中Multiboot双镜像的配置与实现,重点对比了XDC约束和ICAPE2原语两种配置方案的优缺点及适用场景。提供了基于W25Q128 Flash的非对称分区策略、MCS文件生成与烧写方法,并深入探讨了远程更新的流程容错处理与可靠性优化建议,帮助开发者构建稳定可靠的FPGA远程更新系统。

ss78901的博客 839

C++类内成员初始化

c++

robinhjwy的博客 1万+

华为OD机试双机位C卷-魔法收积木 (C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【魔法收积木】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为od - 魔法收积木。

qq_45776114的博客 1941

java禁止类初始化_[改善Java代码]避免在构造函数中初始化其他类

建议35: 避免在构造函数中初始化其他类构造函数是一个类初始化必须执行的代码,它决定着类的初始化效率,如果构造函数比较复杂,而且还关联了其他类,则可能产生意想不到的问题,我们来看如下代码:1 public classClient {2 public static voidmain(String[] args) {3 Son s = newSon();4 s.doSometh...

weixin_33931886的博客 274

1、信息与物理世界:“It from Bit”还是“Bit from It”?

这篇博文探讨了物理学与信息理论之间的深刻联系,从惠勒提出的“It from Bit”概念出发,讨论了信息是否是物质世界的基础,或者物质是否是信息的来源。文章回顾了2013年举办的征文竞赛以及众多学者对这一问题的不同观点,涵盖了量子理论、热力学、计算机科学、黑洞物理以及时空本质等多个领域。同时,文章还分析了信息理论在哲学层面的含义,并展望了其在未来理论、实验和应用研究中的潜力与方向。

water的专栏 290

基于深度学习DNN LSTM网络的光伏发电量预测 完整代码数据 可直接运行

基于深度学习DNN LSTM网络的光伏发电量预测 完整代码数据 可直接运行

2079

C++11列表初始化 {}

C++11引入的列表初始化{}提供了一种统一、安全的初始化方式,具有以下核心特性:1)统一语法,适用于基本类型、数组、结构体、类和容器;2)禁止窄化转换,防止数据精度丢失;3)支持通过std::initializer_list实现容器批量初始化。相较于传统初始化方式,列表初始化显著简化了代码,提高了安全性,特别是在容器初始化和类型转换方面表现突出。该特性使C++的初始化语法更加现代化和规范化。

TTKunn的博客 1649

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java禁止类初始化,为什么Java禁止内部类中的静态字段?

为什么Java禁止内部类中的静态字段?class OuterClass {class InnerClass {static int i = 100; // compile errorstatic void f() { } // compile error}}虽然使用OuterClass.InnerClass.i无法访问静态字段,但如果我想记录应该是静态的内容,例如 创建的InnerClass对象的...

weixin_39914499的博客 223

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

26.特殊类的设计(设计不能被拷贝的类、只能在堆上创建对象的类、只能在栈上创建对象的类、不能被继承的类/只能创建一个对象(单例模式))

为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有。

Q2691463021的博客 985

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

类内初始化、默认构造函数、=default

文章目录010成员属性的类内初始化_常量成员属性初始化011默认构造函数012 =default =delete自动为构造函数生成函数体 010成员属性的类内初始化_常量成员属性初始化 #include<iostream> #include<cstdlib> #include<string> #include<vector> using namespace std; class Time { public: int Hour; int Minute={0

昔拉的博客 1525

瑞_JVM虚拟机_类的生命周期_初始化阶段 <clinit>

本文章为瑞_系列专栏之《JVM虚拟机》的类的生命周期篇的初始化阶段小节。初始化阶段 会执行静态代码块中的代码,并为静态变量赋值,初始化阶段会执行字节码文件中 clinit 部分的字节码指令,初始化阶段就是执行static代码块赋值

阿瑞——从事Java后端,喜欢研读源码、自研框架、分享经验 2896

java类的初始化

简单的归纳一下java类的初始化: 基础知识: 对于一个类,我们可以看到他有 public 类名{} 这样子形式的的构造方法,java中,我们把这样子的方法叫做默认构造器或者无参构造器 可以注意到的是,这个方法没有返回值,即使有这个返回值,那么编译器也并不知道如何处理这个返回值,而且,从实质来说,构造方法其实就是一个隐式的static方法 当我们指定了其他的构造方法,假设有一个

SE不是SE而是SE的专栏 3934

关于类的初始化和赋值

1 sales_iter::sales_iter(const string &book):isbn(book),units_sold(0),revenue(0.0){}//使用构造函数初始化列表进行元素的初始化2 sales_iter::sales_iter(const string &book){isbn=book;units_sold=0;revenue=0.0

王孙贵族的专栏 1002

【C++】初始化列表是什么?初始化列表有什么作用?我们必须要使用初始化列表吗?

在C++中,优先使用初始化列表来初始化自定义类型的成员变量,因为无论如何,成员变量总会在初始化列表中先被初始化。每个成员变量在列表中只能出现一次,意味着初始化不能重复。成员变量的声明顺序决定了其初始化顺序,而与初始化列表的顺序无关。 对于类成员中的引用,必须通过初始化列表进行赋值,因其在定义时必须初始并且不可更改。直接赋值会导致引用对象多次修改,可能引发未定义行为,因此使用初始化列表能确保在对象创建时正确初始化引用对象,提高代码可读性和维护性。 关于初始值,初始化列表的优先级最高,其次是成员变量声明时的

寒雒的博客 2840

类内非相关成员函数,const成员变量初始化,类内初始化

//一:类相关非成员函数 /*(1)定义:也就是和类有关系的函数,但是这个函数不是成员函数。 比如,下面这个函数用来打印一下形参对象的每个成员。*/ class A { public: int a; int b; public: A() :a(1), b(2) { } }; //类相关非成员函数 void func(A &obj) { std::cout << obj.a << obj.b << std::endl; } //(2)使用方式,一

qq_38158479的博客 219
上一篇: 禁止在堆中实例化的类【1】
下一篇: 禁止被继承的类【3】
纯属虚构
博客等级 码龄17年 86粉丝 194原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值