原文地址:https://blog.csdn.net/men_wen/article/details/64443040

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

测试代码(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
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

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

1. 引用
2. 常量
3. 静态变量
4. 静态整型常量
5. 静态非整型常量
  • 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

static用法总结

  • c语言中:

    • 用于函数内部修饰变量,即函数内的静态变量。这种变量的生存期长于该函数,使得函数具有一定的“状态”。使用静态变量的函数一般是不可重入的,也不是线程安全的,比如strtok(3)。
    • 用在文件级别(函数体之外),修饰变量或函数,表示该变量或函数只在本文件可见,其他文件看不到也访问不到该变量或函数。专业的说法叫“具有internal linkage”(简言之:不暴露给别的translation unit)。
  • c++语言中(由于C++引入了类,在保持与C语言兼容的同时,static关键字又有了两种新用法):
    • 用于修饰类的数据成员,即所谓“静态成员”。这种数据成员的生存期大于class的对象(实例/instance)。静态数据成员是每个class有一份,普通数据成员是每个instance 有一份。
    • 用于修饰class的成员函数,即所谓“静态成员函数”。这种成员函数只能访问静态成员和其他静态程员函数,不能访问非静态成员和非静态成员函数。
    • 之所以class的静态成员函数不能访问非静态成员和非静态成员函数,是因为static成员函数对this只针对的限制。this指针是指向调用函数的对象,既然static成员函数不属于某个对象,只和类有关,那么static成员函数则不包含this指针,也就无法隐式调用非静态成员了,原因在这里(C++Primer中文第五版p269)。

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

  1. C++ 类中的static成员的初始化

    #include <iostream> using namespace std; class Test { public:     Test() : y(1), r(y), d(3){} ...

  2. C++ 类中的static成员的使用及单例设计示例

    文章目录 static 静态成员变量 static静态成员函数 单例设计模式 单例实现图片资源的封装(很实用) 静态成员:被static修饰的成员变量\函数 可以通过对象(对象.静态成员).对象指针( ...

  3. 【c++】为什么类中静态(static)成员不能在类的定义内初始化?

    先看一段代码: #include <iostream> #include <string> using namespace std;class loopsaker{ publi ...

  4. C++类中的static数据成员,static成员函数

    文章转自:http://www.cnblogs.com/gysm/archive/2011/09/16/2179277.html 版权归原作者. C++类中谈到static,我们可以在类中定义stat ...

  5. [学习笔记]c#Primer中文版-类设计、static成员、const和readonly数据成员

    类的构成:公开操作和属性:非公开实现细节.         类的设计:1.确定类能执行的操作集,这些操作将成为类的成员函数.                             2.确定每个成员函 ...

  6. C++中的static 成员变量的一些注意点

    C++中的static成员变量主要用来为多个对象共享数据 例: #include <iostream> using namespace std; class Student{ public ...

  7. C++知识点61——typename与class、模板编程与继承、模板类和友元、类模板与static成员

    一.typename与class的异同 1.啥时候既可以使用typename,又可以使用class? 当表示模板参数的时候,二者没有区别 2.啥时候只能使用typename,不能使用class? 当模 ...

  8. 5006.c++类中使用static变量bug

    c++类中使用static变量bug 正常情况,一般c++类中,不能使用static 定义成员,一般情况下在定义时编译器会进行报错.我呢由于c语言的使用习惯,没有太注意.在c++类的方法中,写代码时顺 ...

  9. java类中的static块_java类中static代码块的执行次数

    java类中 static静态代码块的执行次数 1.在类加载的init阶段,类的类构造器中会收集所有的static块和字段并执行,static块只执行一次,由JVM保证其只执行一次. 2.直接看示例 ...

最新文章

  1. Your WebGL implementation doesn't seem to support hardware accelerated rendering. Check your browser
  2. 一步一步asp.net_页面静态化管理
  3. 线程管理(九)使用本地线程变量
  4. winforms中限定上传文件类型
  5. php网页的注册界面设计,HTML开发博客之注册页面设计(一)
  6. 数据仓库之电商数仓-- 3.4、电商数据仓库系统(ADS层)
  7. file结构体中private_data指针的疑惑
  8. Promise的10大知识点!
  9. JSP ssh房地产项目管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计
  10. Python货币转换Ⅰ
  11. 16g电脑内存有什么好处_16G电脑运行内存可以达到什么样子。
  12. 一款高品质回音消除 模块 : F-23
  13. 学习php开发难吗,PHP开发自学难吗,PHP自学要多长时间?
  14. 1123: [POI2008]BLO
  15. 用C++开发STM32程序
  16. 如何让网页自适应所有屏幕宽度
  17. 操作系统Windows【实验】文件复制
  18. 在手机桌面隐藏App的Icon并启动该App
  19. GAN学习教程 (一)
  20. MACH3 G代码自动循环加工简单例子

热门文章

  1. 自洽求解 matlab,【求助】强者进!!自洽薛定谔--泊松方程解
  2. 仿小皮手游网帝国CMS模板源码 大型手游门户网站系统源码+手机版+火车头采集
  3. 正则过滤替换特殊符号
  4. lammps reaxff力场断键分析
  5. 块存储、文件系统存储以及对象存储的特性及其应用
  6. 神犇营-my1034-A + B = C
  7. highlight高亮风格
  8. Excel基本图形可视化介绍
  9. EOF 与 BOF 之分
  10. 从世界杯到12道锋味