static

转载 2017年10月06日 12:28:41


关键字static的意思是静态,有3个明显作用:

1在函数体内,静态变量具有"记忆"功能。即在函数被调用过程中,一个被声明为静态变量的值维持不变。

  static局部变量和普通局部变量的区别:static局部变量只被初始化一次,下一次的运算依据上一次的结果值。

2在模块内,但在函数体外,它的作用域范围是有限制的static类型的变量,是本地的全局变量。所以,可以被模块内的所有函数访问,不可以被模块外的函数访问。

3static类型的函数,与普通类型函数的作用域不一样。静态函数的作用域仅在本文件中,只可被模块内的其它函数调用,不能被模块外的其它函数调用。

C++与类有关的static

 static数据成员特点:

1)对于非静态数据成员,每个类对象都有自己的复制品;而静态数据成员被当做类的成员。无论有多少个对象,静态数据成员只有一个复制品,由类的所有对象共享访问。

2static数据成员存储在全局数据区。定义时要分配内存空间,所以不能在类声明中定义。由于类的所有对象共享,不属于特定的类对象,所以,没有产生类对象时,其作用于可见,即在没有产生类的实例时程序员就可以使用它

3)和普通数据成员一样,遵从publicprivateprotected访问规则。

4必须初始化static成员变量的初始化是在类外。初始化时不带上static的关键字。privateprotectedstatic成员虽然可以在类外初始化,但是不能在类外被访问。

static成员函数特点:

静态成员函数是类的内部实现,属于类定义的一部分。普通成员函数一般隐含this指针,指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象,所以this是默认的。而静态成员函数由于不是与任何对象相联系,因此不具有this指针。从这个意义讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,只能调用静态数据成员和静态成员函数。

 

 

C++中,类的静态成员(static member)必须在类内声明,在类外初始化, 为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。

c++primer》里面说在类外定义和初始化是保证static成员变量只被定义一次的好方法 但为什么static const int就可以在类里面初始化呢?

想起C中一个函数里定义一个static变量是为了保证只初始化一次。 那么,是否可以这样理解: static数据成员在类外定义和初始化是为了保证只被定义和初始化一次,这样编译器就不必考虑类的函数里面第一个对static变量的’=’操作是赋值还是初始化了。 static const int可以在类里面初始化,是因为它既然是const的,那程序就不会再去试图初始化了,碰到初始化语句就跳过?

class A

{ 

private:

    static int count ; // 类内声明

};

int A::count = 0 ; // 类外初始化(不是赋值,注意格式),不必再加static关键字

 

class B

{ 

private:

   static int count = 0; // 静态成员不能在类内初始化,不能保证只初始化一次,会导致每个对象都包含该静态成员

};

 

class C

{ 

private:

   const int count = 0; //常量成员不能在类中声明的地方初始化,因为此时类并没有进行实例化(创建对象),因此并没有分配内存,只是一个样式,不能进行初始化

};

 

 

class D

{ 

private:

static const int count = 0; // 静态常量成员可以在类内初始化,第一个实例化对象时会初始化count,后来因为是const类型就不会再次初始化了,这条语句就不会再调用?

static const float count = 0.0; //errorC2864: 只有静态常量整型数据成员才可以在类中初始化

};

结论:

  • 静态常量数据成员可以在类内初始化(即类内声明的同时初始化),也可以在类外,即类的实现文件中初始化,不能在构造函数中初始化,也不能在构造函数的初始化列表中初始化;

  • 静态非常量数据成员只能在类外,即类的实现文件中初始化,也不能在构造函数中初始化,不能在构造函数的初始化列表中初始化;

  • 非静态的常量数据成员不能在类内初始化,也不能在构造函数中初始化,而只能且必须在构造函数的初始化列表中初始化;

  • 非静态的非常量数据成员不能在类内初始化,可以在构造函数中初始化,也可以在构造函数的初始化列表中初始化;

     

    总结如下表:

类型 初始化方式

类内(声明)

类外(类实现文件)

构造函数中

构造函数的初始化列表

非静态非常量数据成员

N

N

Y

Y

非静态常量数据成员

N

N

N

Y (must)

静态非常量数据成员

N

Y (must)

N

N

静态常量数据成员

Y

Y

N

N

 

 以下三种类型必须通过初始化列表来初始化
1.
非静态 常量


2.
引用类型


3.
没有默认构造函数的类类型

 

相关文章推荐

22_static video

  • 2016年03月28日 15:58
  • 11.18MB
  • 下载

C语言中的extern,static和register的一些用法

在谈extern和static用法之前,我们首先要清楚了解一些基础概念。 linkage链接属性有三种:external, internal, none。C和指针给出的介绍如下: Identifi...

Java static修饰成员变量

  • 2017年04月24日 22:15
  • 4KB
  • 下载

wxWidgets-2.8.12-vc6-unicode-static.zip

  • 2016年02月04日 10:59
  • 35.43MB
  • 下载

Java 中的 static 使用之静态变量以及静态初始化块

Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。 静态成员可以使用类名直接访问(HelloWorld.hobby),...

Static and dinamic balance

  • 2013年12月04日 22:31
  • 3.45MB
  • 下载

openssl static library

  • 2016年11月14日 08:36
  • 4.15MB
  • 下载

Unity3D - 关于Static静态对象

在官方文档中的描述: 许多的优化需要知道一个对象可以移动的游戏中。关于静态信息(IE,非移动)对象往往可以预先计算在知识的编辑器,它将不受物体的位置变化无效。例如,渲染可以通过组合几个静态对象到...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:static
举报原因:
原因补充:

(最多只允许输入30个字)