c语言中静态整形变量,转:C语言中的static变量和C++静态数据成员(static member)

C语言中static的变量:1).static局部变量        a、静态局部变量在函数内定义,生存期为整个程序运行期间,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。

b、对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。

2).static全局变量

全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件(.h或.cpp)内有效, 在同一源程序的其它源文件中不能使用它(注意,这一点和C++是不同的)。

关于C语言static变量的理解:

A、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

B、若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

C、静态变量和全局变量放在程序的全局数据区,而不是在堆栈中分配,所以不可能导致堆栈溢出;

D、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题(线程不安全);

C++中静态数据成员的特点有::

1、静态数据成员仅仅在初始化时不受访问权限的约束;

2、静态数据成员最好不要在.h文件中进行定义(初始化),而是放在.cpp文件中定义(初始化);

3、静态数据成员被类的所有对象所共享,包括类的派生类的所有对象;——即派生类和基类共享一个静态成员。

4、静态数据成员的类型可是所属类自己,即在一个类中可以声明该类自己的类型的静态成员对象,但是,不可以定义普通的成员对象,(指针可以)

5、在const成员函数中,可以修改static成员变量的值。普通成员变量的值,是不能修改的。

6、static成员函数只能访问static成员,不能访问非static成员,并且static成员函数不能定义为virtual、const、volatile 函数。

详细分析如下:

类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。

和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。注意::仅仅是初始化时不遵守public/protected/private的规则。

即:如果是private和protected的静态成员,只能通过public的静态成员函数进行调用,而不能通过类名直接访问了。

1、静态数据成员的定义(初始化)不能在头文件中。

静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。

其定义方式与全局变量相同。举例如下:

xxx.h文件

class base

{

private:

static const int _i;           //声明,标准c++支持有序类型在类体中初始化,但vc6不支持。

};

xxx.cpp文件

const int base::_i=10;                 //仅仅在定义(初始化)时不受private和protected访问限制.

注:不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。即使加上#ifndef #define #endif或者#pragma once也不行。

2、静态数据成员   被 类 的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。举例如下:

class base

{

public :

static int _num;         //声明

};

int base::_num=0;                   //静态数据成员的真正定义

class derived:public base

{

};

main()

{

base a;

derived b;

a._num++;

cout<

b._num++;

cout<

}

// 结果为1,2;可见派生类与基类共用一个静态数据成员。

3、静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为所属类类型的 指针或引用。举例如下:

class base{

public :

static base _object1;                       //正确,静态数据成员

base _object2;                                  //错误

base *pObject;                                  //正确,指针

base &mObject;                               //正确,引用 (引用需要在构造函数的参数初始化列表中初始化,如下:)

};

这个类要能创建对象,需要定义带有参数初始化列表的构造函数,如下:

class base{

public :

static base _object1; //正确,静态数据成员

base *pObject;            //正确,指针

base &mObject;         //正确,引用

base():mObject(*this){}

};

4、静态数据成员的值在const成员函数中可以被合法的改变,而不破那个数据成员的值,不能在const成员函数中改变。

#include

using namespace std;

class Student

{

private:

static int a;

int b;

public:

void change() const;

void setB(int b);

int getB();

static int getA();

};

void Student::change() const

{

a++;//这个可以,因为a是static成员变量。

b++;//不可以,因为b是普通成员变量(如果b不是成员变量(是全局变量,普通参数,函数内部定义的临时变量)也可以别修改),且是const函数

}

int Student::getA()

{

return a;

}

void Student::setB(int b)

{

this->b = b;

}

int Student::getB()

{

return b;

}

int Student::a = 5;

int main(int argc,char *argv[])

{

Student stu;

stu.setB(10);

stu.change();

cout<<:geta>

cout<

return 0;

}

即:成员函数的const约束,只起作用于类的普通成员变量,对于全局变量,成员函数参数,成员函数内部的临时变量起不到作用。

C&plus;&plus;中static修饰的静态成员函数、静态数据成员

1.静态成员函数.静态数据成员 在类中,用static修饰的成员函数被称为静态成员函数,而用static修饰的数据成员就称为静态数据成员:与普通的成员函数和数据成员不同, 静态成员函数和静态数据成员有 ...

静态数据成员(面向对象的static关键字)

静态数据成员: 在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员.先举一个静态数据成员的例子. #include using namesp ...

内部类不能有静态变量(除静态的对Static的理解)

关于内部类(static与final) Static 不用实例化就能加载进内存 而内部类需要外部类实例化后才能加载进内存.这就间接造成static需要实例化了.与static不需要实例化语义矛盾 1. ...

Java语言中的volatile变量

Java中的两种内置同步机制: synchronized 和 volatile 变量, volatile修饰的变量, 在使用时会强制检查最新值. 有synchronized的值可见性, 但是没有其操作 ...

在不同语言中static的用法

static (计算机高级语言) 编辑 像在VB,C#,C,C++,Java,PHP中我们可以看到static作为关键字和函数出现,在其他的高级计算机语言如FORTRAN.ALGOL.COBOL.BA ...

(转)static 变量

一. static 变量 static变量大致分为三种用法1. 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期.2. 用于全局变量,主要作用是限制此全局变量被其他的文 ...

为什么static数据成员一定要在类外初始化&quest;&lpar;转&rpar;

1.避免重复定义和初始化 <>说在类外定义和初始化是保证static成员变量只被定义一次的好方法. 但,为什么static const int就可以在类 ...

再看static数据成员

当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享.各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关. ...

C语言中static变量详解

Static翻译出来是“静态”“静止”的意思,在C语言中的意思其实和它的本意差不多,表示“静态”或者“全局”的意思,用来修饰变量和函数.经static修饰过后的变量或者函数的作用域或者存储域会发生变化 ...

随机推荐

关于Advertising Campaign

Advertise Campaigns 是指为了传播企业创意或者宣传主题而采取的一些列的整合营销(IMC)活动,也称为广告战役.广告战役主要在一段明确的时间内,通过不同的媒体渠道投放广告,现在经常会整 ...

Runner站立会议01

开会时间:9.10-9.30 地点:二教 今天做了什么:学了文本输入,button按钮,界面转换(意图) 遇到什么困难:界面转换时,出现问题,没有正常跳转 明天打所作什么:解决今天遇到的问题,学了第二 ...

使用rosed编辑ROS文件

1.1使用rosed. rosed是rosbash套件的一部分.它可以使你通过package的名字直接编辑一个package中的文件而不用输入package的整个路径. 用法: $ rosed [pa ...

ios 多任务学习笔记

一.检测多任务是否支持: - (BOOL) isMultitaskingSupported{ BOOL result = NO; if ([[UIDevice currentDevice] respo ...

IOS文件操作的两种方式:NSFileManager操作和流操作

1.常见的NSFileManager文件方法 -(NSData *)contentsAtPath:path //从一个文件读取数据 -(BOOL)createFileAtPath: path cont ...

(转)Linux下增加交换分区的大小

场景:最近在Linux环境安装ELK相关软件时候发现机器特别的卡,所以就查看了Linux机器的内存使用情况,发现是内存和交换分区空间太小了. 对于虚拟机中的内存问题,可以直接通过更改虚拟机的硬件进行解 ...

使用iconfont图标

iconfont.cn基本使用 登录iconfont.cn网站,直接使用github账号即可登录 输入关键字搜索需要的图标,然后在需要的图标上点击'添加入库' 点击网站右上角的购物车图标,查看当前已入 ...

03&lowbar;Kafka集群操作

1.集群配置思路 1)每台节点上要启动一个broker进程,因此要配置每台的server.properties broker id, log.dirs, zookeeper.connect 2) 每台 ...

Java算法 -- 顺序表

顺序表结构定义:就是按照顺序存储方式存储的线性表 1.定义一个顺序表的基本数据: static final int MAXLEN = 100; Class Student{ private Strin ...

Oracle 数据库名、实例名、Oracle&lowbar;SID

本文参考自ORACLE 数据库名.实例名.ORACLE_SID的区别,纯属读书笔记,加深记忆 在ORACLE7.8数据库中只有数据库名(db_name)和数据库实例名(instance_name).在 ...

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值