关闭

static

199人阅读 评论(0) 收藏 举报
分类:


关键字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.
没有默认构造函数的类类型

 

0
0
查看评论

static及其作用域

<br />一、面向过程设计中的static 1、静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下: //Example 1#include <iostream.h>void ...
  • celerylxq
  • celerylxq
  • 2011-01-24 09:12
  • 10377

对C语言中的static关键字的深入理解

通过对static关键字的解析,讲述了其背后与编译,链接相关的原理。
  • on_1y
  • on_1y
  • 2014-04-22 09:53
  • 14156

react中ES6语法报错:static propTypes,static defaultProps :modulbuild failed:SyntaxError

在ES6语法中创建组件,组件内部定义静态propTypes及defaultProps ,编译过程出现错误: modulbuild failed:SyntaxError 解决方法如下: 一  不安装babel-preset-stage-0依赖时,可以把静态默认属性放在组件外 cl...
  • qq_35388564
  • qq_35388564
  • 2017-07-25 16:44
  • 936

const static 与static const的使用

 查看文章  C++ static、const和static const 以及它们的初始化2010-03-29 15:30C++   static、const和static const 以及它们的初始化(2010-02-16 17:27:47)转载标...
  • weishan521520
  • weishan521520
  • 2010-09-20 15:17
  • 17098

linux下编译静态(static)库

configure的时候要指定 --enable-static  ,因为很多平台没有基础库,指定该选项将免去一些不必要的麻烦。 #./configure --enable-static 如果是嵌入式平台的话,首先应指定CC,即用什么编译器,以及平台等 CC=ar...
  • RandyLeonard
  • RandyLeonard
  • 2014-01-15 11:05
  • 1291

内部类学习(五)--静态内部类(Static Inner Class)

这里介绍最后一种比较特殊的内部类――静态内部类(Static Inner Class),即在内部类的前面增加了static修饰符(modifier)。注意,仅仅只有内部类能够被声明为static类型,通常我们声明一个普通类的时候不能使用static,否则编译出错。那么为什么我们要使用静态的内部类呢?...
  • CMTobby
  • CMTobby
  • 2006-09-29 09:03
  • 6588

关于static 定义的对象系统默认初始值

在Charles Petzold第五版的《windows程序设计》中,看到这样一些代码:                  &#...
  • RichieVoe
  • RichieVoe
  • 2012-09-07 18:17
  • 1388

java回顾篇——static和非static的区别

关于static和非static变量的区别。 1. static 修饰的变量称为类变量或全局变量或成员变量,在类被加载的时候成员变量即被初始化,与类关联,只要类存在,static变量就存在。非static修饰的成员变量是在对象new出来的时候划分存储空间,是与具体的对象绑定的,该成员变量...
  • a907691592
  • a907691592
  • 2016-06-14 08:20
  • 3613

private static与public static的用法及区别(Java)

其实,理解这两者的区别并不难,因为(public、private)和static这两种修饰符的作用本就不同,所以要理解两个的区别,其实就是这两种修饰符效果累加起来之后的区别。 static:静态修饰符,被static修饰的变量和方法类似于全局变量和全局方法,可以在不创建对象时调用,当然也可以在创建对...
  • u013165504
  • u013165504
  • 2015-05-03 16:12
  • 11466

java面试题之static

java面试题之static
  • zhangxiaomin1992
  • zhangxiaomin1992
  • 2016-03-30 15:40
  • 1713
    个人资料
    • 访问:25297次
    • 积分:1262
    • 等级:
    • 排名:千里之外
    • 原创:90篇
    • 转载:78篇
    • 译文:0篇
    • 评论:1条
    最新评论