C++ 的静态成员变量为什么一定要在类外定义

C++ 的静态成员变量在类中的使用 C++静态成员变量需在类外定义的原因在于:1)遵循分离式编译模型,避免头文件被多次包含导致的重复定义错误;2)静态成员属于类而非对象,需显式分配全局存储空间。传统做法要求在类内声明、类外定义,但C++17引入了inline静态成员变量,允许类内直接定义。模板类的静态成员需包含模板参数进行定义。这种设计既保证了存储空间的唯一性,又提供了灵活的初始化方式。 阅读详情

C++ 的静态成员变量为什么一定要在类外定义

函数如下,在C++中声明静态成员变量的时候,在类中只是进行了声明,并没有实际的申请出指针的内存,真正的内存是定义初始化的时候才会进行内存的申请,因此,又因为static类型的变量都是随着类的,因此不能随着对象的创建而申请内存,所以需要单独的进行类外定义,在定义的时候C++编译器会申请内存给静态指针。

#include <iostream>

using namespace std;

class Singleton
{
private:
    Singleton()
    {
        cout << "sluggard singleton construct start." << endl;
    }

public:
    static Singleton *getInstance(void)
    {
        if(NULL == m_psl) // 懒汉式,每次获取实例都要判断,在多线程中会存在问题
        {
            m_psl = new Singleton;
        }
        return m_psl;
    }

    static void FreeInstance()
    {
        if(NULL != m_psl)
        {
            delete m_psl;
            m_psl = NULL;
        }
    }
private:
    static Singleton *m_psl;
};

Singleton *Singleton::m_psl = NULL;

// 懒汉式,只有在使用的时候才会去创建
// 存在的问题,多个线程同时首次调用时,可能会出现创建多次的问题(导致内存泄漏)

int main(int argc, char const *argv[])
{
    
    // 使用功能去全局获取接口获取资源
    Singleton *p1 = Singleton::getInstance(); 
    Singleton *p2 = Singleton::getInstance();

    if(p1 == p2)
    {
        cout << "p1 equal p2" << endl;
    }
    else
    {
        cout << "p1 not equal p2" << endl;
    }
    
    // 手动释放单例模式创建的唯一一个对象
    Singleton::FreeInstance();
 
    cout << "singleton." <<  endl;
    return 0;
}



STM32 ADC精准采集12V电池电压:从分压电路到软件校准全解析 本文详细解析了STM32 ADC精准采集12V电池电压的全过程,涵盖分压电路设计、电阻选型、ADC配置优化及软件校准方法。针对电池电压监测中的噪声、温漂等挑战,提供了硬件滤波与软件过采样等实战技巧,确保测量精度达到1%以内,满足嵌入式设备对电源管理的严苛要求。 阅读详情

相关推荐

全国排污许可证数据

from tkinter import * # 导入窗口控件 import tkinter.filedialog import requests from lxml import etree from tkinter import ttk from bs4 import BeautifulSoup import webbrowser # 调用浏览器打开网页 from tkinter import messagebox # 弹出提示框 from openpyxl import Workbook imp.

Newnotes的博客 3385

详解静态成员变量以及静态成员函数

类的静态成员变量是该类的所有对象共有的(只有一份),只能在类里声明,类外定义。相当于只属于类的全局变量。1、定义: 只能在全局中定义2、访问方式:(假如类A 中有公有静态变量 _a) ,可以用 A::_a 或 A a;a._a;访问3、不支持给缺省值(因为静态成员变量不走初始化列表)4、静态成员变量只能初始化一次,所以不能走初始化列表5、计算类的大小时不包括静态成员变量的大小,因为它在静态区,不算在类里。

m0_74626010的博客 861

OpenAI Realtime API实时语音交互实战指南

实时语音交互是人机自然对话的核心能力,其本质在于构建低延迟、双向、流式协同的音频-语义闭环。它突破传统REST API的请求-响应范式,依托WebSocket实现毫秒级音频输入流(audio.delta)、模型生成流(text/audio.delta)与动态控制流(session.update)三重并行。该技术显著降低端到端延迟至300ms以内,支撑语音助手、智能客服、对话式教育等强实时场景。本文聚焦OpenAI Realtime API的工程落地,详解PCM音频流处理、VAD语音活动检测、AudioCon

weixin_32285357的博客 391

c++静态成员变量为什么要在类外部定义

1、静态成员变量是所有实例共享的,但是其只是在类中进行了声明,并未定义或初始化(分配内存),类和者类实例就无法访问静态成员变量,这显然是不对的,所以必须先在类外部定义,也就是分配内存。...

琅嬛福地 2265

SpotBugs实战:10大类Bug检测规则详解与代码优化实例(附避坑清单)

本文深入解析SpotBugs在Java开发中的实战应用,详细讲解10大类Bug检测规则与代码优化实例,包括NPE防御、多线程安全、性能优化等关键问题。通过具体代码示例和避坑清单,帮助开发者提升代码质量,有效集成到CI/CD流程中。

weixin_42665255的博客 194

OpenClaw用户必看:每天0成本使用OpenClaw!NVIDIA NIM免费大模型接入教程

🚀 OpenClaw接入NVIDIA NIM免费API!glm5、minimax-m2.5等大量模型任选,0成本升级AI助手!💰

XiaoqiangClub的博客 5574

C++之类的静态成员函数和静态成员变量

C++之类的静态成员函数和静态成员变量 静态成员在类的所有对象中是共享的。即只要在类外初始化之后,该类的所有对象都可以对静态成员进行操作。静态成员变量只能在类内声明,在类外定义,静态成员函数不能调用非静态成员函数,但是可以调用全局函数。 #include <iostream> using namespace std; class TClass { public: //错误写法,static int b =2;静态成员变量只能在类外定义,类内声明,通过int TClass::b = 2

YANJINING 1025

基于YOLOv8的水果新鲜程度检测系统设计与实现

数据采集与预处理模块:负责收集水果图像数据并进行标注和增强深度学习模型:基于YOLOv8的目标检测模型新鲜度评估模块:根据检测结果评估水果新鲜程度用户界面:提供友好的交互界面系统集成:将各模块整合为完整系统水果新鲜程度检测需要包含多种水果在不同新鲜度状态下的图像数据集。:包含5种常见水果(苹果、香蕉、橙子、葡萄、草莓)在不同新鲜度下的图像包含约8,000张图像,分为新鲜和腐烂两类AgriVision:大型农业图像数据集,包含水果检测和分类任务Fruit-360:包含120种水果的高质量图像。

YOLO 444

为什么类的静态成员变量要在类外初始化

1. 在类中,只是声明了静态变量,并没有定义。 2. 声明只是表明了变量的数据类型和属性,并不分配内存;定义则是需要分配内存的。   注意:如果在类里面这么写int a; 那么是既声明了变量,也定义了变量,两者合在一起了。 3. 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“对象(实例)级别”的。类级别的成员,先于该类任何对象的存在而存在,它被该类所有的对象共享。 4. 现

shandianling 6752

Briefings in Bioinformatics投稿经验分享

Briefings in Bioinformatics投稿经验分享

LiRongLu_的博客 3337

【机器学习】一文搞懂算法模型之:Transformer

必会算法模型之:Transformer

商务合作 | 面试培训 | 职场规划 ==>主页扫码 5608

为什么 C++ 的静态成员变量要类内声明、类外定义?

C++静态成员变量需要类内声明、类外定义的原因在于:静态成员属于整个类而非单个对象,类声明仅提供编译信息而不分配内存。类内声明相当于"产品说明书",类外定义才是真正创建变量(分配内存并初始化)。C++17后支持inlinestatic实现类内初始化,但传统方式仍需要类外定义以确保变量实体存在。这一机制体现了C++对内存管理的精确控制。

2303_79225753的博客 473

PCL 基于视椎体裁剪点云

PCL 基于视椎体裁剪点云

dayuhaitang1的博客 4083

C++为什么要使用静态成员变量和静态成员函数,以及要在类内声明和在类外定义(初始化)

相关文章 1.静态成员变量和静态成员函数诞生顺序,以及为什么诞生(使用场景)? 2.有无this指针? 3.和类以及对象的关系? 4.如何定义以及访问的方式与普通成员变量和普通成员函数的区别? 5.是怎么分配内存的? 当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成员函数并不属于某一对象(所有对象共有,没有this指针,不能访问本类中非静态成员,有点...

vict_wang的博客 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

静态成员变量一定要初始化吗?

我们知道C++类的静态成员变量是需要初始化的,但为什么要初始化呢。 其实这句话“静态成员变量是需要初始化的”是有一定问题的,应该说“静态成员变量需要定义”才是准确的,而不是初始化。 两者的区别在于:初始化是赋一个初始值,而定义是分配内存。 静态成员变量在类中仅仅是声明,没有定义,所以要在...

chidanzhu4790的博客 5362

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[c/c++] 静态成员函数里访问静态成员变量出现 “undefined reference to ”

我们知道,静态成员变量和静态成员函数都是独立于类的实例存在的,即便类实例不存在,静态成员变量和函数都是可以独立访问的。这是因为其内存特殊性而导致的。然而有些时候会把函数的实现写在h文件里,这个时候在使用static成员变量和函数的时候就需要注意,h文件会被编译器认为是声明,因此如果在类中写 static int i;,则编译器会认为这是声明而不是定义,因此 i 实际上并不存在于内存中,这个时候如果在 h 文件的 静态成员函数中访问 i 则会报错 undefined reference to。

ykun089的博客 3533

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

为什么static数据成员一定要在类外初始化?

因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。在《c++primer》里面说在类外定义和初始化是保证static成员变量只被定义一次的好方法。 class A { private: static int num; //类内声明 }; int A::num = 0; //类外定义初始化 不仅仅是static的成员不能在类内定义,const类的也不能在类内定义 ...

duxinyu的博客 1676

【C++十万个为什么】静态变量为什么要在类外声明

静态成员变量在 C++ 中属于类本身,而不是类的对象实例。因此,静态成员变量需要在类外进行初始化,以确保它们的存储空间在整个程序中只有一个。

m0_69378371的博客 1218

C++静态成员变量为什么在类外部定义?

c++中静态成员变量要在类外部再定义,否则产生link2001错误. class testClass {   public:   static int m_i; }; // 类外部定义,若不写会产生 // error LNK2001: unresolved external symbol "public: static int testClass::m_i" (?m_i@te

murongjianke001的专栏 764

为什么C++要求静态成员在类外单独定义:编译器视角的深度剖析

深入解析C++静态成员的类外定义机制,揭示编译器如何处理静态成员的内存分配与链接。适用于理解类设计原理与避免链接错误,掌握正确声明与定义方法,提升程序健壮性,值得收藏。

CodeWhim的博客 320

c++中静态成员变量要在类外部再定义或初始化的原因

c++中静态成员变量要在类外部再定义,否则产生link2001错误. class testClass {   public:   static int m_i; }; // 类外部定义,若不写会产生 // error LNK2001: unresolved external symbol "public: static int testClass::m_i" (?m_i@testClass...

大猪的博客 1811

c++中静态成员变量为什么要在类外部再定义?

今天在编译tvision的Demo时遇到了很多链接错误,后来发现tvision的代码中很多类中声明的静态成员变量没有在类的实现文件中定义导致。 参考这里的讨论: http://bbs.youkuaiyun.com/topics/360126427 问: class testClass { public: static int m_i; }; int testClass::m...

weixin_30552811的博客 204

类中定义一个static数据成员,为什么还要在类外定义?

 类中定义一个static数据成员,为什么还要在类外声明?       C++中规定,static数据成员必须在类外部进行初始化,并不是在类外声明。       而且类中的static数据成员占有空间为什么不算在类中?其占用的空间在哪里?       因为static成员与class中的数据成员不在同一个内存段,static存贮在静态存贮区,而class-member(非static成员)则不一定

evilotus的专栏 2962

c++中静态成员变量要在类外部再定义,否则产生link2001错误

2014-01-10 15:18:42 分类: C/C++ c++中静态成员变量要在类外部再定义,否则产生link2001错误. class testClass {   public:   static int m_i; }; // 类外部定义,若不写会产生 // error LNK2001: unresolved external symbol

I‘m Groot 456

C++静态成员变量为什么要类外初始化

关于C++静态成员变量的知识点以及为什么必须在类外进行初始化

weixin_44115575的博客 1869

C++类中的静态成员函数以及静态成员变量

C++类中的静态成员函数以及静态成员变量

森明帮大于黑虎帮的博客 8371
上一篇: C++基于多态实现依赖颠倒原则附源码
下一篇: cmake中添加 -g编译选项
andrewbytecoder
andrewbytecoder 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄10年 3476粉丝 687原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

andrewbytecoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值