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


//test.cpp
#include <stdio.h>class A
{public:static int a; //声明但未定义,还未分配内存
};int main()
{printf("%d", A::a);return 0;
}

编译以上代码会出现“对‘A::a’未定义的引用”错误。这是因为静态成员变量a未定义,也就是还没有分配内存,显然是不可以访问的。再看如下例子:

//test.cpp
#include <stdio.h>
class A
{public:static int a; //声明但未定义
};int A::a = 3; //定义了静态成员变量,同时初始化。也可以写"int A:a;",即不给初值,同样可以通过编译int main()
{printf("%d", A::a); // 可以说明类静态成员变量的初始化会在生成类对象之前return 0;
}

这样就对了,因为给a分配了内存,所以可以访问静态成员变量a了。因为类中的静态成员变量仅仅是声明,暂时不需分配内存,所以我们甚至可以这样写代码:

//a.cpp
class B; //这里我们使用前置声明,完全不知道B是什么样子
class A{public:static B bb;//声明了一个类型为B的静态成员,在这里编译器并未给bb分配内存。
//因为仅仅是声明bb,所以编译器并不需要知道B是什么样子以及要给其对应的对象分配多大的空间。
//所以使用前置声明"class B"就可以保证编译通过。
};

使用命令"g++ -c -o a.o a.cpp"通过编译。对于类来说,new一个类对象不仅会分配内存,同时会调用构造函数进行初始化,所以类对象的定义和初始化总是关联在一起。

C++ 类的静态成员变量为什么一定要初始化相关推荐

  1. 类的静态成员变量和静态成员函数的使用方法三

    第五个例子,使用类的静态成员变量 源码打印? #include <stdio.h> class Point { public: Point() { m_nPointCount++; } ~ ...

  2. 类中静态成员变量 无法解析的外部符号

    [1]如下代码及编译错误 如标题,不做赘述. [2]原因及解决方案 原因:之所以报如上编译错误,因为静态成员变量未初始化. 解决方案:类中静态成员需要在类外进行初始化.其格式为:类型 类名::静态成员 ...

  3. C++类的静态成员变量

    #include<iostream>using namespace std; class Rect {public:Rect() {count++;}~Rect() {count--;}s ...

  4. PHP 类的静态成员变量和普通成员变量对比

    有很多人可能弄不清楚,在PHP中类的静态成员变量和普通成员变量有什么区别? 1.类的静态方法只能访问静态成员变量,而不能访问非静态成员变量 2.静态成员变量不需要实例化就能访问,且访问速度快一些 3. ...

  5. C++:类的静态成员变量及静态成员函数

    写在前面: 对象与对象之间的成员变量是相互独立的.要想共用数据,则需要使用静态成员和静态方法 只要在类中声明静态成员变量,即使不定义对象,也可以为静态成员变量分配空间,进而可以使用静态成员变量.(因为 ...

  6. C/Cpp / 类中静态成员变量和普通成员变量的区别

    2017-12-11 创建人:Ruo_Xiao 实例代码: #include <iostream> class CMan { public:CMan() {}~CMan() {} publ ...

  7. c++静态成员变量使用前必须初始化,那么下面这个例子为什么不用初始化?

    有三个文件: student.h文件 #include <string> #include <iostream> using namespace std; const int ...

  8. C++类静态成员变量作用域共享问题

    在C++中类的静态成员变量对于所有此类声明的变量来说共享. 也就是说你声明了一个A类,A类里包含了一个静态的成员变量test,然后声明了多个A类的类变量,这些类变量共享一个成员变量test内存空间,有 ...

  9. C++类的静态成员详细讲解

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...

  10. C++ 类的静态成员详细讲解

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...

最新文章

  1. 高级软件工程第二次作业
  2. Go gin参数绑定
  3. 什么是TTL电平、CMOS电平、RS232电平
  4. linux qt手册,明远智睿I.MX6 Linux-4.1.15 QT5 程序编译手册
  5. 《revolution in the valley》读后随笔--Steve jobs与Macintosh
  6. mysql 多条记录判断相加减进行计算
  7. IDEA开发WebService遇到的问题和SOAPUI工具的使用
  8. AT2 Homeomorphism and the group structure on a circle
  9. HTML Agility Pack:简单好用的快速 HTML Parser
  10. 大数据基础概念思维导图
  11. Android手机通讯录制作
  12. java模拟器vivo_vivo X3t驱动下载
  13. 2022年低压电工考试题模拟考试题库及模拟考试
  14. Python爬虫小项目——实现英语翻译功能(四)
  15. android studio 魅族真机 flyme6 下logcat 打印自定义日志
  16. 利用触发器生成三分频
  17. Teamvier提示商业用途限制使用的解决方案
  18. JAVA中浮点数取整数部分和取小数部分
  19. Html及CSS实现旋转效果
  20. 几乎全面的食品英文总结 (吃遍英文单词

热门文章

  1. 小程序不同页面之间通讯的解决方案 1
  2. jQuery实现清空table表格除首行外的所有数据
  3. linux 学习6 软件包管理 资料链接
  4. Java教程01.Java简介与环境配置
  5. [转]在C#中使用MSHTML的高级支持接口
  6. Reflector使用手记
  7. 4.微服务设计 --- 集成
  8. 5.PHP ES 使用
  9. 6. Git 开启匿名访问
  10. 12. 开发工具(make,makefile)