C++中类的静态变量在哪初始化

2023-11-12

C++中类的静态变量在哪初始化

static修饰的成员变量存在哪?

----------------------------------------------------

static成员变量:不能在头文件中初始化

//3.static成员必须在类外初始化;并且,不能在头文件中初始化;否则,在链接时可能会出现重定义的问题。

==============================

C++成员初始化

class Wzz
{
private:
    int a=0 ;
    const int b;
    static int c;
    int& f;
    static const int d = 0;
    const static int e = 0;
};


//1.一般常量 a,

a.可以在声明时给缺省值,这样即使在构造函数中没有初始化a,a也会被初始化成缺省值
b.可以在构造函数内部给值,也可以在初始化列表中给定数值初始化。
Wzz(int _a)
    :a(_a)
{
    a = _a;
}
 
//2.const修饰的和引用必须在初始化列表中初始化
 
//3.static成员必须在类外初始化,并且不能在头文件中初始化,否则在链接时可能会出现重定义的问题
 
//4.staic const可以在类内声明时就定义初始化,也可以在类外初始化
 
//5.自定义类型对象。该对象没有默认构造函数的话要在初始化列表里初始化,有的话不必处理

C++中类的静态变量在哪初始化

静态数据成员的使用方法和注意事项如下:


1、静态数据成员在定义或说明时前面加关键字static。

2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:

<数据类型><类名>::<静态数据成员名>=<值>


这表明:

  (1) 初始化在类体外进行,而且前面不能加static。 

  (2) 初始化时,不加该成员的访问权限控制符private,public等。 

  (3) 初始化时,使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。

  • 注 1. 意味着:与对象无关,一个类可以有 N个对象。
  • 注 2. 本质上,就相当于是“全局变量”,只不过增加了一个作用域限定符;也就是相当于增加了一个命名空间;这比单纯的全局变量,更能防止命名冲突。

3、静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。

4、引用静态数据成员时,采用如下格式:

<类名>::<静态成员名> 

静态变量的初始化

  如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员。  

exp:
class aclass{
      public:   
              static int a;
};
int aclass::a=0; //初始化:
类外初始化。

  

void main()
{
        int amain=0;
        amain=aclass::a;     //使用,无需定义相关类的变量而直接使用之。

static修饰的成员变量先于对象存在,故static修饰的成员变量必须在类外初始化


静态常量的初始化

对于 静态常量整型 可以在类中初始化,另外对于常量则必须在构造函数成员初始式列表里初始化。

#include <iostream>
using namespace std;
class Person
{
    public:
    const int a ;
    static const int b = 2 ; // 对 静态-常量整型 初始化
    Person(int aa):a(aa) // 这里必须对常量a初始化,也只能这样初始化。
    {}
};

  
int main()
{
    cout << Person::b << endl;
    Person p(9);
    cout << p.a << endl ;
    return 0;
}

C++ static静态成员变量详解

注意:

static 成员变量不占用对象的内存,而是在所有对象之外开辟内存,即使不创建对象也可以访问

具体来说,static 成员变量和普通的 static 变量类似,都在内存分区中的全局数据区分配内存,不了解的读者请阅读《C语言内存精讲》专题。

几点说明

    一个类中可以有一个或多个静态成员变量,所有的对象都共享这些静态成员变量,都可以引用它。

    static 成员变量和普通 static 变量一样,都在内存分区中的全局数据区分配内存,到程序结束时才释放。这就意味着,static 成员变量不随对象的创建而分配内存,也不随对象的销毁而释放内存。而普通成员变量在对象创建时分配内存,在对象销毁时释放内存。

    静态成员变量必须初始化,而且只能在类体外进行。例如:

int Student::m_total = 10;

初始化时可以赋初值,也可以不赋值。如果不赋值,那么会被默认初始化为 0。全局数据区的变量都有默认的初始值 0,而动态数据区(堆区、栈区)变量的默认值是不确定的,一般认为是垃圾值。

    静态成员变量既可以通过对象名访问,也可以通过类名访问,但要遵循 private、protected 和 public 关键字的访问权限限制。当通过对象名访问时,对于不同的对象,访问的是同一份内存。

————————————————
版权声明:本文为CSDN博主「luoganttcc」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/luoganttcc/article/details/121121478

static修饰的成员变量存在哪?

1.static segment(栈):申明一个局部变量放在栈中。
2.heap segment(堆):new一个对象时,对象放在堆中。
3.data segment(数据区):static的变量或者字符串变量放入数据区。
4.code segment(代码区):类中的方法放入代码区。
————————————————
版权声明:本文为CSDN博主「大可爱吃瓜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38331643/article/details/83963523

static修饰的成员方法, 变量及其初始化

1.static修饰的成员变量

    static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。

    【静态成员变量特性】

        不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
        既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
        类变量存储在方法区当中
        生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁

2.static修饰的成员方法

    static修饰的成员方法,成为静态方法,其也是不属于某个具体的对象,是所有对象共享的.

    【静态成员方法特性】

        不属于某个具体的对象,是类的属性,是所有对象共享的,不存在对象的空间中
        既可以通过对象访问,也可以通过类名访问,但是一般更推荐使用类名访问,体现其实类的属性

    3.成员方法与静态成员变量一样储存在方法区中
    4.生命周期伴随类的一生

package demo3;

public class Demo3 {
    static String name;
    int age;
    public static void func(){
        System.out.println("这是一个静态的成员方法");
    }
}
class Demo99{
    public static void main(String[] args) {
        Demo3 demo3=new Demo3();
        Demo3.func();//使用类名来调用静态的成员方法
        demo3.func();//使用对象的引用来调用静态的成员方法
      demo3.name="yaoyao";//使用对象的引用对静态的成员变量进行赋值
    Demo3.name="哈哈";//使用类名对静态成员变量进行赋值
        System.out.println(demo3.name);//使用对象的引用来调用静态
        //成员变量
        System.out.println(Demo3.name);//使用类名来调用静态成员变量
    }
  }

 

3. 如何对静态成员进行初始化

方法一:

    在创建时进行初始化
    在这里插入图片描述

方法二:

    后续初始化
    在这里插入图片描述

方法三:

    用set方法进行初始化
    在这里插入图片描述

方法四:

    使用静态的代码块进行初始化
    在这里插入图片描述
    但是我发现使用非静态的代码块好像也可以对静态成员变量进行初始化
    在这里插入图片描述
    运行结果如图:(结果就是非静态的代码块覆盖掉了静态代码块所赋的值)
    在这里插入图片描述

方法五:

    在构造方法中初始化静态成员变量(仅仅是尝试)
    在这里插入图片描述
    运行结果:(目前根据运行结果来看是可以的)
    在这里插入图片描述

应该还有很多方法来初始化我们的静态成员变量,我们可以不断尝试下…
————————————————
版权声明:本文为CSDN博主「c_topy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_55204216/article/details/128335685

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中类的静态变量在哪初始化 的相关文章

  • asp:repeater 折叠表行 - 已更新

    我想知道是否有人对我的问题有创造性的解决方案 我有一个从我的数据库填充的转发器 如下所示
  • 集群():是否可以仅检查文件是否已锁定,而不实际获取锁定(如果没有)?

    我的用例如下 我有一个程序 它强制在任何给定时间只能运行它的一个实例 因此在启动时它总是尝试在标准位置获取锁定文件 并在该文件终止时终止已经被锁定 这一切都工作正常 但现在我想用一个新的命令行选项来增强程序 当指定该选项时 将导致程序只打印
  • 全局变量不好

    好吧 读完这篇文章和一些示例后 我仍然不清楚全局变量的含义 那么你的类中的私有变量是全局的吗 http www c2 com cgi wiki GlobalVariablesAreBad http www c2 com cgi wiki G
  • 如何获取枚举数作为常量?

    From 枚举中定义的项目总数 https stackoverflow com questions 856154 total number of items defined in an enum 我发现我可以使用以下方法获取枚举数 Enum
  • 使用 C 的另一个结构内的灵活长度结构数组

    你好 我正在尝试使用 C 来实现一个简单的结构 2 个盒子 每个盒子包含不同数量的颗粒 main 中传递的粒子的确切数量 我写了以下代码 typedef struct Particle float x float y float vx fl
  • 二叉树和快速排序?

    我有一个家庭作业 内容如下 别生气 担心 我是not请你帮我做作业 编写一个程序 通过使用二分查找的快速排序方法对一组数字进行排序 树 推荐的实现是使用递归算法 这是什么意思 到目前为止 这是我的解释 正如我在下面解释的那样 我认为两者都有
  • 如何反序列化 XML 文档

    如何反序列化此 XML 文档
  • 有关shared_ptr的竞态条件示例

    为什么没有竞争条件代码片段 https godbolt org z nEYPYqdqK below include
  • 将两个垂直滚动条相互绑定

    我在控件中有两个 TextBox 并且它们都有两个 VerticalScrollBar 我想在它们之间绑定 VerticalScrollBars 如果一个向上 第二个也会向上等等 如果可以的话我该怎么做 Thanks 不是真正的绑定 但它有
  • 大小为 k 的非连续子序列的最大值的最小值

    在开始之前 我希望这个问题不是重复的 我发现了几个类似的问题 但它们似乎都没有描述完全相同的问题 但如果它是重复的 我会很高兴看到一个解决方案 即使它与我的算法不同 我一直在尝试回答这个问题 https stackoverflow com
  • 对象变空似乎是 Hangfire 中的反序列化问题

    Hangfire 似乎无法反序列化我的原始版本Scheduler对象及其所有状态 我正在调用其 Execute 方法BackgroundJob Enqueue 如下所示 Scheduler new FileInFileOut FileIn
  • 批量插入,asp.net

    我需要获取与会员相对应的 ID 号列表 在任何给定时间处理的数量可能在 10 到 10 000 之间 我可以毫无问题地收集数据 解析数据并将其加载到 DataTable 或任何内容 C 中 但我想在数据库中执行一些操作 将所有这些数据插入表
  • 如何使用 itextsharp 更改 PDF 公式的按钮图标?

    我目前正在尝试使用 itextsharp 填写预定义的表单 除了添加图像之外 一切正常 这之前已经在 Adob e 的 FDF 工具包中运行过 该工具包已编译为 NET 1 1 这不再适用于 NET 4 0 我改用了 itextsharp
  • 如何处理文件名中的空格

    我正在尝试迭代本地目录中的文件 foreach string name in Directory GetFileSystemEntries path FileAttrtibutes att File GetAttributes name 文
  • Qt - 添加超链接到对话框

    有没有办法在 Qt 对话框中添加可点击的超链接 IE 它应该看起来像一个超链接 蓝色文本 当您单击它时 它应该在浏览器中打开该超链接 像这样的东西 Use QLabel setOpenExternalLinks bool 并在标签上设置文本
  • 从 SQL 语句中检索元数据(表名)

    我使用的是 Visual Studio 2008 我创建了一个 Winforms 应用程序 并且尝试从 SQL 语句中提取表名 con new SqlConnection connString String queryString Sele
  • 在 OSX 上检测 Objective C 或 C++ 中的文件夹访问(如 fs_usage 命令)

    我正在 OSX 上开发实时病毒扫描程序 OSX 的命令行命令fs usage可以通过以下方式确定文件夹访问权限 并且只能以 root 用户身份运行 fs usage w f pathname grep Users Documents Use
  • 使用 StartServiceCtrlDispatcher 与 StartService 从 C 语言启动 Windows 服务有什么区别?

    我尝试使用 StartServiceCtrlDispatcher 中所述https msdn microsoft com en us library windows desktop bb540475 v vs 85 aspx https m
  • TCP/IP 传输期间套接字数据损坏

    当我通过预连接的 TCP IP 套接字发送数据时 我发现数据已损坏 Example Station1 正在向 Station2 发送数据 我已经在发送之前 在 S1 和接收之后 在 S2 打印了数据 以下是消息 S1 发送的数据是ACKS2
  • C# 使用 .Equals() 比较两个 double

    我使用 ReShaper 当我用 比较两个双精度值时 它建议我应该使用 Math 具有公差的 ABS 方法 看 https www jetbrains com help resharper 2016 2 CompareOfFloatsByE

随机推荐

  • WINAPI WinMain

    include
  • 为什么每个程序执行都有内核地址空间和程序地址空间?

    为什么每个用户态的程序映射到虚拟地址空间 都需要有内核地址空间和程序地址空间呢 因为程序地址空间最终都会调用系统调用 也就是内核的东东 所以每个程序要想执行 就必须有内核地址空间 也必须有程序地址空间 所用的application程序要想使
  • 11 种加密 & 哈希算法的原理及其 Java 实现

    11 种加密 哈希算法的原理及其 Java 实现 一 目的 二 运行环境 三 基本原理及步骤 I 各种加密算法的原理 DES 数据加密标准 Data Encryption Standard 算法介绍 算法流程 优点 缺点 破解方式 适用场景
  • Linux期末考试题库(超全)

    文章目录 Linux期末考试题库 选择题 填空题 简答题 操作题 Linux期末考试题库 选择题 在创建Linux分区时 一定要创建 D 两个分区 A FAT NTFS B FAT SWAP C NTFS SWAP D SWAP 根分区 在
  • react样式处理

    react样式处理有两种处理方式 行内样式处理 使用className来定义类名 使用行内样式处理 语法 lt 元素 style css属性1 值1 css属性2 值2 gt 用法 引入react核心包 import React from
  • 完全免费快速搭建个人www服务器

    想拥有自己的web服务器吗 想把服务器放到自己家里吗 通过ADSL拨号也能建立个人的服务器吗 本文告诉你答案 要建立自己的web服务器 需要两个最重要的工作 1 让别人知道你的主机 目前访问Internet上主机的方式主要有两种 一是通过I
  • [JAVAee]SpringBoot配置文件

    配置文件的介绍 配置文件当中记录了许多重要的配置信息 例如 数据库的连接信息 用户的账户与密码 项目的启动端口 第三方系统的调用密匙 用于记录问题产生的日志 在spring框架中一些特定的框架会自动调用配置文件中的配置信息来运用 配置文件中
  • KCF论文技术路线

    https blog csdn net crazyice521 article details 53525366 http www cnblogs com YiXiaoZhou p 5925019 html 一 算法介绍 KCF全称为Ker
  • 搭建高可用mongodb集群(三)—— 深入副本集内部机制

    在上一篇文章 搭建高可用mongodb集群 二 副本集 介绍了副本集的配置 这篇文章深入研究一下副本集的内部机制 还是带着副本集的问题来看吧 副本集故障转移 主节点是如何选举的 能否手动干涉下架某一台主节点 官方说副本集数量最好是奇数 为什
  • 微信小程序中获取用户信息getUserInfo替换方案

    场景说明 我们在开发过程中 如果使用getUserInfo获取用户头像和昵称等用户信息时 会出现如下报错 in promise MiniProgramError errMsg getUserInfo fail scope unauthori
  • 冒泡排序--数组的简单排序,从大到小,从小到大

    冒泡排序 是计算机程序中较为常见和简单的排序算法 它需要重复地走访需要进行排序的元素列 按照一定顺序依次比较两个相邻的元素 如果顺序错误就把他们交换过来 示意原图如下 我们需要的结果示意图如下 那我们应该怎么进行程序的编写才能满足这样的结果
  • Stable Diffusion WebUI安装ControlNet插件

    ControlNet是一种通过添加额外条件来控制扩散模型的神经网络结构 sd webui controlnet下载地址 GitHub Mikubill sd webui controlnet WebUI extension for Cont
  • 一些基本引言的知识点

    文章目录 一些基本引言的知识点 系统调优你所不知道的TIME WAIT和CLOSE WAIT 一些基本引言的知识点 哥在 PHP7 中 把 HashTable 结构体从 72 字节压缩到了 56 字节 表 看起来不 的优化 实际上是成倍的性
  • 万能密码为什么能成功

    1 在用户名处输入 admin or 1 1 输入任意密码 2 表单成功绕过 登陆成功 万能密码成功的原因 万能密码的用户名和密码 admin or 1 1 或者1 or 1 1 or 1 1 这个的原理就是利用了数据库在查询过程中的代码漏
  • 【C语言】整型数据在内存中的存储(详解)

    数据存储 文章目录 数据类型 布尔类型 无符号数据的打印 不同数据占用的字节 整型在内存中的存储 整型家族 原反补 三兄弟 二进制要怎么写出来呢 什么是符号位 大小端问题 判断当前编译器是大端还是小端 为什么整型在内存中存放的是补码呢 结语
  • 【软件测试】自动化测试战零基础教程——Python自动化从入门到实战(六)

    整理不易 希望对各位学习软件测试能带来帮助 软件测试知识持续更新 第五章 自动化测试用例设计 第一节 手工测试用例与自动化测试用例 手工测试用例与自动化测试用例对比 用例选型注意事项 第二节 测试类型 测试静态内容 测试链接 功能测试 测试
  • Relatives 【POJ - 2407】【欧拉筛、预处理】

    Given n a positive integer how many positive integers less than n are relatively prime to n Two integers a and b are rel
  • vs中报错error C4996: 'wcstombs': This function or variable may be unsafe

    遇到这样的情况就是缺少宏 所以需要我们将需要的宏进行加上就可以了 在以下的位置 项目 gt 属性 gt 配置属性 gt C C gt 预处理器 gt 预处理器定义 增加 CRT SECURE NO DEPRECATE 完成
  • QTreeWidget存放自定义数据

    QTreeWidget 双击可编辑的设置 connect ui treeWidget RedLamp SIGNAL itemClicked QTreeWidgetItem int this SLOT Slot TreeRedLampIncr
  • C++中类的静态变量在哪初始化

    C 中类的静态变量在哪初始化 static修饰的成员变量存在哪 static成员变量 不能在头文件中初始化 3 static成员必须在类外初始化 并且 不能在头文件中初始化 否则 在链接时可能会出现重定义的问题 C 成员初始化 class