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++中类的静态变量在哪初始化 的相关文章

  • 双缓冲列表框

    我有一个 CheckedListBox WinForms 控件 它继承自 ListBox 谷歌搜索显示问题出在 ListBox 该控件锚定到其窗体的所有四个边 当调整表单大小时 列表框会出现难看的闪烁 我尝试继承 CheckedListBo
  • 在派生自 Control 的 ASP.NET 自定义控件中呈现自关闭标记

    我正在开发 Facebook FBML 控件库 并希望创建类似于 ASP NET WebControls 库的 FBML 控件 我有一个默认处理渲染的基类 这是我的渲染方法 protected override void Render Ht
  • 代码块调试问题

    我正在尝试在代码块中运行一个简单的链表程序 但我无法运行该程序并且收到以下错误 Active debugger config GDB CDB debugger Default Building to ensure sources are u
  • 查找周边上的点来表示边界/形状

    我有一个简单的二维网格 其格式为myGrid x y 我正在尝试找到一种方法来找到所选网格周围的周长 这样我就有了所选网格的形状 这是我的意思的一个例子 这里的想法是找到所有相关的 角点 也就是图像周边的红点 放入一个列表中 这样我就可以从
  • 有了private修饰符,为什么可以直接访问其他对象中的成员呢?

    我有以下代码 class A private int x public A x 90 A A a1 A a2 a1 x 10 a2 x 20 int getX return this gt x 我知道代码可能很奇怪 但我不明白为什么a1 a
  • 类型定义存在于两个库中

    我正在使用 NET 4 5 构建 ASP NET Web 窗体网站 错误 The type System ComponentModel DataAnnotations Schema ForeignKeyAttribute exists in
  • 使用 boost::asio 是否有一种可移植的方法来查找空闲端口号

    我目前正在尝试找出一种方法来查找空闲端口号以建立连接 最好使用 boost asio 然后 该端口号将用于侦听 只有这样我才能打开套接字 大致来说 有没有办法做到 tcp resolver query query localhost por
  • 带有 Prism 区域适配器的 AvalonDock

    我看到了一些关于 SO 的问题 但似乎没有一个适合我 我希望能够使用伟大的使用 Prism 4 但是 所有示例区域适配器均适用于 Avalondock 1 x 系列 我无法使其工作 有人有关于如何为 AvalonDock 的 LayoutD
  • 可以轻易移动,但不可轻易复制

    是否可以创建类类型 即 普通移动构造 但不是普通复制构造 但仍然可复制构造 普通复制构造 但不是普通移动构造 但仍然可移动构造 可以简单地复制分配 但不能简单地移动分配 但仍然可以移动分配 可以简单地移动分配 但不能简单地复制分配 但仍然可
  • 变形:Opencv 使用 Visual Studio 将图像显示到曲面屏幕

    我正在尝试使用 opencv API 来扭曲图像 以便将其显示到曲面屏幕上 我已经浏览了opencv中提供的翘曲apihere http docs opencv org 2 4 modules stitching doc warpers h
  • 给出对象的指针作为参数

    假设我有 void func foo obj 我有 foo object 我该如何制作object进入争论func 只需取消引用它即可 func object
  • OpenCV:处理每一帧

    我想使用 OpenCV 编写一个跨平台应用程序进行视频捕获 在所有示例中 我发现来自相机的帧是使用抓取功能进行处理并等待一段时间 我想处理序列中的每一帧 我想定义自己的回调函数 每次当一个新帧准备好处理时都会执行该函数 例如直播对于 Win
  • Parallel ForEach 的本地初始化如何工作?

    我不确定 Parallel ForEach 中本地 init 函数的使用 如 msdn 文章中所述 http msdn microsoft com en us library dd997393 aspx http msdn microsof
  • 如何在 ASP.NET MVC 中获取参数数组作为 GET / POST?

    如何最好地获取数组 item gt value 对作为 GET POST 参数 在 PHP 中 我可以这样做 网址 这得到的参数为 Array a gt Array one gt 100 two gt 200 有什么方法可以在 ASP NE
  • 如何从 MongoDB 中的 ChangeStream 过滤对特定字段的更新

    我正在设置一个 ChangeStream 以便在集合中的文档发生更改时通知我 以便我可以将该文档的 LastModified 元素更新插入到事件发生的时间 由于此更新将导致 ChangeStream 上发生新事件 因此我需要过滤掉这些更新以
  • 实例着色器矩阵的设置

    我想绘制实例立方体 我可以打电话GL DrawArraysInstanced PrimitiveType Triangles 0 36 2 成功地 我的问题是所有立方体都绘制在相同的位置和相同的旋转 我如何为每个立方体单独更改它 要创建不同
  • 隐式类型转换 - 编译器错误

    这个问题与this https stackoverflow com questions 3529449 can i make the ternary operator treat my class like a bool问题 下面的代码在V
  • { Qt5.0.2/QML/QtQuick2.0/C++ } 运行没有错误的示例项目? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的设置是Qt5 0 2 MinGW 32位 我在寻找 Qt5 0 2 QML QtQuick2 0 C 代码项目示例 不是Qt Qu
  • 绑定未正确更新用户控件属性 MVVM

    编辑 删除旧代码 我将它放在 MainWindow xaml 上
  • 将 Web 场迁移到 ASP.NET 运行时版本 4,同时保持会话

    我们已将 Web 应用程序从 net 运行时 2 v 3 5 迁移到 net 运行时 4 v 4 5 我有一个部署问题 我们的 sessionstate 服务器是一个 stateserver 并在单独的服务器上运行框架 2 中的 aspne

随机推荐

  • 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