C++ 类中的static成员的初始化和特点

2023-11-19

C++ 类中的static成员的初始化和特点

在C++的类中有些成员变量初始化和一般数据类型的成员变量有所不同。以下测试编译环境为:

➜   g++ -v
Using built-in specs.
COLLECT_GCC=g++
Target: x86_64-linux-gnu
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 

测试代码(g++编译通过):

#include <iostream>

using namespace std;

class Test
{
public:
    Test() : y(1), r(y), d(3){} //对于常量型成员变量和引用型成员变量,必须通过参数化列表的方式进行初始化。
    ~Test(){}

    int y;      //普通变量成员
    int &r;     //引用成员变量
    const int d;    //常量成员变量
    static int c;   //静态成员变量
    static const int x = 2.1;   //静态常量整型成员变量
    static const int xx;        //静态常量整型成员变量声明
    static const double z;  //静态常量非整型成员变量声明
    static const float zz = 6.6;    //静态常量非整型成员变量
};


const int Test::xx = 4; //静态常量整型成员变量定义
const double Test::z = 5.1; ////静态常量非整型成员变量定义
int Test::c = 2;

int main(void)
{
    cout << Test::x << endl;    

    return 0;
}

这些特殊类型的成员变量主要有:

1. 引用
2. 常量
3. 静态变量
4. 静态整型常量
5. 静态非整型常量
  • 对于==1. 引用==和==2. 常量==,成员变量必须通过构造函数的==参数列表==的方式初始化。例如:上述程序中的r 和 d 变量的初始化。

  • 对于==3. 静态变量==,static成员变量需要在类定义体外进行初始化与定义,因为static数据成员独立该类的任意对象存在,它是与类关联的对象,不与类对象关联。例如:上述程序中的c变量的初始化。

  • 对于==4. 静态整型常量==,该类型成员可以直接在类中初始化,也可以在类中声明,在类定义体外进行定义。例如:上述程序中的x和xx变量。

  • 对于==5. 静态非整型常量==,该类型也是可以在类中声明在类定义体外进行定义,或者直接在类中定义初始化。例如:上述程序中的z和zz变量。

结论:

静态成员属于类作用域,但不属于类对象,它的生命周期和普通的静态变量一样,程序运行时进行分配内存和初始化,程序结束时则被释放。所以不能在类的构造函数中进行初始化。

static成员的优点

  • static成员的名字是在类的作用域中,因此可以避免与其它类成员或全局对象名字冲突
  • 可以实施封装,static成员可以是私有的,而全局对象不可以
  • 阅读程序容易看出static成员与某个类相关联,这种可见性可以清晰地反映程序员的意图

static成员函数特点

  • 因为static成员函数没有this指针,所以静态成员函数不可以访问非静态成员。
  • 非静态成员函数可以访问静态成员。
  • 静态数据成员与类的大小无关,因为静态成员只是作用在类的范围而已。
#include <iostream>

using namespace std;

class test2
{
public:
    test2(int num) : y(num){}
    ~test2(){}

    static void testStaticFun()
    {
      cout << "y = " << y << endl; //Error:静态成员函数不能访问非静态成员
    }

    void testFun()
    {
        cout << "x = " << x << endl; 
    }
private:
    static int x;//静态成员变量的引用性说明
    int y;
};

int test2::x = 10;//静态成员变量的定义性说明

int main(void)
{
    test2 t(100);
    t.testFun();

    return 0;
}

static用法总结

  • c语言中:
    • 用于函数内部修饰变量,即函数内的静态变量。这种变量的生存期长于该函数,使得函数具有一定的“状态”。使用静态变量的函数一般是不可重入的,也不是线程安全的,比如strtok(3)。
    • 用在文件级别(函数体之外),修饰变量或函数,表示该变量或函数只在本文件可见,其他文件看不到也访问不到该变量或函数。专业的说法叫“具有internal linkage”(简言之:不暴露给别的translation unit)。
  • c++语言中(由于C++引入了类,在保持与C语言兼容的同时,static关键字又有了两种新用法):
    • 用于修饰类的数据成员,即所谓“静态成员”。这种数据成员的生存期大于class的对象(实例/instance)。静态数据成员是每个class有一份,普通数据成员是每个instance 有一份。
    • 用于修饰class的成员函数,即所谓“静态成员函数”。这种成员函数只能访问静态成员和其他静态程员函数,不能访问非静态成员和非静态成员函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 类中的static成员的初始化和特点 的相关文章

  • Word Automation - 禁用警报

    我正在自动化 Word 因此我想抑制所有警报 Word Application word new Word Application word DisplayAlerts Microsoft Office Interop Word WdAle
  • 为什么隐式类型转换没有警告?

    我终于发现了程序中的一个错误 该错误是由返回类型的隐式类型转换引起的 即使g Wall对此没有任何警告 我想知道是否有什么办法可以快速找出这种无意识的错误 include
  • 如何使用C#检测IIS版本?

    如何使用C 检测IIS版本 更新 我的意思是来自 winapp 实际上该场景是开发一个自定义安装程序 想要检查已安装 IIS 的版本以调用适当的 api 在这里找到了答案 链接文本 http forums iis net p 1162404
  • 了解左值到右值转换的示例

    我很难理解这段代码 来自 C 14 草案标准的示例 转换拉瓦尔 调用未定义的行为g false 为什么constexpr使程序有效 另外 不访问 是什么意思 y n 在两次通话中g 我们正在返回n数据成员那么为什么最后一行说它不能访问它呢
  • 为什么 Resources.Load 返回 null?

    我的项目有多个精灵 位于 Assets Sprites 中 我想使用 C 脚本加载它们 我已经测试过这个 Sprite myFruit Resources Load
  • 如何吞咽……有具体原因的异常

    在这个方法中 public static void Detach try using var master new DataContext Data Source LocalDB MSSQLLocalDB Initial Catalog m
  • 将 XML 转换为 JSON 时保留 json:Array 属性

    我有一段 XML 看起来像
  • C# - 当站点上没有活动时,Quartz 调度程序停止运行

    我用quartz调度器创建了asp net站点 该作业正在后台运行 站点上没有其他活动 Quartz 调度程序每 30 分钟调度一次 IIS启动后 Scheduler运行正常 但一段时间后 Scheduler 停止运行 大约 1 小时 如果
  • 托管 C++ 和 AnyCPU

    我有一个托管 C dll 我从 C 项目中引用它 C 项目将被编译为 AnyCPU 有没有办法编译 32 位和 64 位版本的托管 C dll 然后告诉 C 项目在运行时根据正在运行的体系结构加载正确的版本 让 AnyCPU dll 与 C
  • 再次对存储库和持久性一无所知

    这就是我要做的 我有一个通用的存储库类Repository
  • std::mutex 和 std::shared_mutex 之间的区别

    我遇到了一个std shared mutex in C 17 到底是什么std shared mutex以及它有何不同std mutex 如中所述文档 http en cppreference com w cpp thread shared
  • 只允许在 datagridview 单元格中键入一些字符

    有没有办法只将某些字符添加到 datagridview 单元格中 像 1234567890 据我所知 您可以使用两种方法来实现此目的 第一个 我认为最好的 是使用 CellValidating 事件DataGridView并检查输入的文本是
  • 如何保存具有多个缩进设置的XmlDocument?

    我需要保存一个XmlDocument以适当的缩进归档 Formatting Indented 但有些节点及其子节点必须排在一行 Formatting None 从那时起如何实现这一目标XmlTextWriter接受整个文档的设置 在 Ahm
  • 使用箭头键滚动可滚动控件

    我正在使用一个ScrollableControl在我的 C 项目中 我想知道如何将箭头键映射到垂直 水平滚动 编辑 我的图片框获得焦点 并且我设法映射滚动键 这里的问题是 当我按下箭头键时 它会滚动一次 然后失去焦点 将其交给滚动查看器旁边
  • 编译使用Basler相机的程序

    我正在尝试使用 Basler 相机捕获图像的 C 程序来工作 我拿到 来自制造商的代码 它应该 非常容易使用 但是 链接它有 成为一场噩梦 我的 C 时代已经过去了 最近只使用 Matlab 所以我可能会犯一些愚蠢的错误 但请赐教 代码如下
  • 为什么不能使用 C# 对象初始值设定项语法调用方法? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 消息在事务处理时未到达 MSMQ

    我在本地计算机中创建了一个私有 MSMQ 我使用以下 C 代码将消息发送到队列 当我将队列更改为事务性队列时 消息未到达 MSMQ 但是 Send 方法中没有抛出异常 我需要做出什么改变才能使其发挥作用 using System using
  • 在 C# 中同步闪烁标签

    我创建了一个BlinkingLabel类 源自Forms Label 其中有一个Forms Timer这允许我启用和禁用闪烁效果 我创建了 4 个标签BlinkingLabel类型 我的问题是 如果所有 4 个标签在不同时间闪烁 则闪烁效果
  • Qt 对象的生命周期

    Qt 对象的生命周期是多少 Such as QTcpSocket socket new QTcpSocket 套接字什么时候会被销毁 我应该使用 delete socket 有什么区别吗 QTcpSocket socket 我找不到有关此的
  • 制作一个未知大小的数组 C# [重复]

    这个问题在这里已经有答案了 可能的重复 C 中未知长度的数组 https stackoverflow com questions 599369 array of an unknown length in c sharp 我想创建一个程序 用

随机推荐

  • AFNetwork 作用和使用方法具体解释

    转自 http www maxiaoguo com clothes 269 html AFNetworking是一个轻量级的iOS网络通信类库 它建立在NSURLConnection和NSOperation等类库的基础上 让非常多网络通信功
  • Android:通用的ListView数据适配器

    在写Android程序时 经常会用到ListView控件进行数据展示 使用时 需要定义一个ListView并创建其Item布局 然后对ListView设置一个适配器adapter 一般继承自BaseAdapter 同时需要定义一个ViewH
  • 如何消除@Autowired报Field injection is not recommended的警告

    对于一些强迫者来说 代码中有一些警告 就看起来很不爽 今天笔者我也遇到了这种问题 在SpringBoot中 使用 Autowired的时候 警告Field injection is not recommended 如下图 Spring Te
  • electron安装过程中遇到的问题

    安装总结 项目本身安装是用的npm 这个在我们这里 不翻墙是大概率用不了的 所以必须修改镜像源或者用cnpm 一开始的尝试是用 cnpm 但是到后面安装脚手架的时候 脚手架里封装的方法是npm 这时候 脚手架的安装就会有问题 综上 还是需要
  • STM32 USART通信协议详细讲解—小白入门

    文章目录 一 串口通信协议简介 二 物理层 2 1 电平标准 2 2 RS 232 信号线 三 协议层 3 1 波特率 3 2 通讯的起始和停止信号 3 3 有效数据 3 4 有效检验 四 STM32 的 USART 简介 4 1 USAR
  • SQL语句关键字大全

    SQL语句的整理以及总结 目录 SQL语句的整理以及总结 目录 SQL语句的基本类型 S Q L 语
  • 【智慧医疗】Springboot+Vue+Element-UI前后端分离的医疗管理平台

    目录 需求分析 系统概要 技术选型 功能模块 后端逻辑 需求分析 随着第五代移动通信技术 5G 高速发展 推动新一代信息技术与各个行业的融合发展 各行各业都在积极融合智能现代化概念 努力把互联网技术运用到其中 在我国目前人口基数大 对医疗服
  • 【C++笔记】NULL、0、nullptr区别分析

    一 C的NULL 在C语言中 我们一般使NULL表示空指针 即 int i NULL foo t f NULL 但是 实际上在C语言中 NULL通常被定义为 define NULL void 0 也就是说NULL实际上是一个void 的指针
  • C++中的友元分析

    友元函数 class stu public friend int ret stu my stu int a 10 this gt a a private int a int b int ret stu my return my a 定义友元
  • c#的dllimport使用方法详解

    DllImport是System Runtime InteropServices命名空间下的一个属性类 其功能是提供从非托管DLL 托管 非托管是微软的 net framework中特有的概念 其中 非托管代码也叫本地 native 代码
  • 手机游戏软件开发的前景 The future of development of game software on mobiles

    一 课题名称 手机游戏软件开发的前景 The future of development of game software on mobiles 二 课题分析 计算机领域的方向很多 我对手机游戏的开发比较感兴趣 而且3G手机的时代即将到来
  • 编写一个Book类,该类至少有name和price两个属性。该类要实现Comparable接口,在接口的compareTo()方法中规定两个Book类实例的大小关系为二者的price属性的大小关系。在

    编写一个Book类 该类至少有name和price两个属性 该类要实现Comparable接口 在接口的compareTo 方法中规定两个Book类实例的大小关系为二者的price属性的大小关系 在主函数中 选择合适的集合类型存放Book类
  • pc 后台管理系统总结

    人力资源后台管理系统 hrsaas 1 项目介绍 hrsaas是一款对公司员工管理的后台管理系统 主要实现功能 公司组织架构的增删改查 公司角色的增删改查以及公司信息内容展示 员工信息的查阅 员工在公司的工作状态 是否转正 离职 调岗 担任
  • Java基础之String类型详解

    目录 1 简介 2 字符串的比较 3 String的实例化方式 1 直接赋值方式 2 构造方法实例化 4 String对象 常量 池 5 字符串修改 6 String类常用方法 1 字符串查找 2 字符串替换 3 字符串拆分 4 字符串截取
  • 【ReactiveX】Observable 对象(译)

    更多内容 欢迎关注作者博客 http www china10s com blog p 475 Observable 对象 在 ReactiveX 中 一个观察者向 Observable 对象订阅消息 然后这个观察者将会响应 Observab
  • 区块链学习笔记4——BTC实现

    区块链学习笔记4 BTC实现 学习视频 北京大学肖臻老师 区块链技术与应用 笔记参考 北京大学肖臻老师 区块链技术与应用 公开课系列笔记 目录导航页 UTXO 区块链是一个去中心化的账本 比特币采用了基于交易的账本模式 然而 系统中并没有记
  • IPv4、IPv6、UDP、TCP数据报首部格式分析

    一 IPv4首部格式 图片来源 图解TCP IP 通过wireshark抓QQ的数据报 IPV4的数据报格式和上面的一致 现在进行分析 相对重要的会红色标记 1 版本 version 由4比特构成 表示标识IP首部的版本号 如上是版本号为4
  • 面试专题:Linux运维精华面试题

    下面是一名资深Linux运维求职数十家公司总结的Linux运维面试精华 助力大家跳槽找个高薪好工作 1 什么是运维 什么是游戏运维 1 运维是指大型组织已经建立好的网络软硬件的维护 就是要保证业务的上线与运作的正常 在他运转的过程中 对他进
  • java双人对弈五子棋源码_java swing 双人五子棋源代码

    import java awt Color import java awt Font import java awt Graphics import java awt Toolkit import java awt event MouseE
  • C++ 类中的static成员的初始化和特点

    C 类中的static成员的初始化和特点 在C 的类中有些成员变量初始化和一般数据类型的成员变量有所不同 以下测试编译环境为 g v Using built in specs COLLECT GCC g Target x86 64 linu