C++中static用法总结
1用于局部变量
C++中局部变量有三种:
(1)auto:此关键词常常省略。auto type a 常常简写为type a。
如:
int a=auto int a
存储在内存的栈中,只在此局部区域有定义,程序执行过此局部区域自动释放。
(2)static:有以下特点:
(1)声明在局部区域,第一次执行时定义,以后就不再定义;
(2)同auto和register,只在其定义的局部区域有定义;
(3)区别与auto和register,static局部变量存储在内存的静态变量区。所以下次执行到此局部区域时,上次的结果值得以保留。
例:
int get()
{
static int a=;
return a++;
}
int main()
{
cout<<get()<<get();
return ;
}
程序输出:01。第二次不再执行static变量a的定义。
(3)register:基本同auto,只是直接存储在CPU的寄存器组。
2用于全局变量和全局函数
你可能会问?用在局部就存储在内存的静态变量区了,那么定义到全局又有什么作用呢?
这种定义常用于有多个文档的工程的变量/函数保护。举个栗子:
static int a,
static void fun();
上面定义了一个全局static变量a,一个static函数fun。
加上static可以保证其它文档不可以访问到他们。回想一下,怎样让一个变量在多个文档中都可以使用?extern!对的。
Talk is cheap, I will show you the code:
/*FileName: File1.cpp */
int a; /*FileName: File2.cpp*/
extern int a;
在File1.cpp中定义了int a,只需在File2.cpp中extern一下,便可以把File1.cpp中的变量a直接拿来用,他们是同一个变量。
那么,如果File1.cpp中,我们把a的定义换为static int a,那么在File2.cpp中extern int a会发生什么呢?肯定报错啦,我刚刚都说过了,static定义在全局,可以起到保护作用,保证此定义只能被本文档使用。
函数的情况也是一样的。
3用于成员变量
class A
{
public:
static int a;
};
a便成为了A的静态成员变量。
(1)它只属于A,不属于A的任何一个对象。
(2)它不能被A的构造函数初始化,需要单独定义、初始化,其方法和类成员函数的定义相同。
(3)两种访问方法:
1)通过类A::a; 2)通过类对象/指针:obj_A.a,ptr_A->a。
例子:
class A
{
public:
static int a;
};
int A::a = ;
int _tmain(int argc, _TCHAR* argv[])
{
A obj_A;
A *ptr_A=&obj_A;
cout << A::a << " " << obj_A.a << " " << ptr_A->a << endl; while ();
return ;
}
4用于成员函数
成员函数有了static的修饰便成了静态成员函数,它的基本属性与静态成员变量一致。另外,由于虚函数要在对象中创建虚表,所以虚函数无法为static函数。
小总结:不能为虚的几种函数:普通函数、友元函数、构造函数、静态成员函数、内联函数。
静态成员函数最大的特点是它没有this指针,它的其它特性都因此而来。如果对一个静态成员函数求指针,得到的将不是一个指向member function函数的指针,而是指向普通function的指针。例如
有classA一个函数static void fun();&classA::fun()会得到void(*)(),而不是void(classA::*)()。也就是说,static最大程序上近似于非成员函数。这种特性提供了一个意想不到的好处:static成员函数可以作为callback函数!
C++把静态成员函数称作类方法,把其他成员函数称作实例方法。不同之处:
(1)类方法只有一份实例,不属于任何一个对象。
(2)类方法只能调用类方法,不能调用实例方法。而实例方法可以调用类方法。
(3)类方法不能调用非静态成员变量
最后一个栗子:
class cA
{
public:
int objVar1;
static int classVar1;
static void classFun1()
{
classVar1 = ;
objVar1 = ;//错误!!!类方法无法访问非静态成员函数
classFun2();
objFun1();//错误!!!类方法无法调用实例方法
};
static void classFun2(){};
void objFun1()
{
classVar1 = ;
objVar1 = ;
classFun1();
objFun2();
};
void objFun2(){};
};
C++中static用法总结的更多相关文章
- c/c++中static用法总结
static的作用主要有两种: 第一个作用是限定作用域:第二个作用是保持变量内容持久化: c语言中static的用法: 1.全局静态变量: 用法:在全局变量前加上关键字static,全局变量就定义成一 ...
- C++中static用法
本文为个人学习笔记,参考<C++ Primer(中文第五版)>和<王道程序员求职宝典> 本文分为两个部分:不考虑类.类中static的作用 一.不考虑类,static的作用 1 ...
- C/C++中static关键字的用法
1.什么是static? static 是C/C++中很常用的修饰符,它被用来控制变量的存储方式和可见性. 1.1static的引入 我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它 ...
- C/C++中static的用法全局变量与局部变量
1.什么是static? static 是C/C++中很常用的修饰符,它被用来控制变量的存储方式和可见性. 1.1static的引入 我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它 ...
- C++ 中 static 与 const 的用法及对比
在这个学习过程中我对 static 及 const 的使用时常会混淆,因此整理,加深记忆 一.类的静态成员 如果某个属性为整个类所共有,不属于任何一个具体对象,则采用 static 关键字来声明静态成 ...
- Java中static的用法,初始化块
使用 Arrays 类操作 Java 中的数组语法: Arrays.sort(数组名); 可以使用 sort( ) 方法实现对数组的排序,只要将数组名放在 sort( ) 方法的括号中,就可以完成对该 ...
- C++和Java中的静态Static用法
C++和Java中都有的一个静态关键字Static,可以放在类中的变量或者函数之前,就成了静态变量或者静态函数. 静态变量又分为静态全局变量和静态局部变量,可参见网上大神总结的C++全局变量,局部变量 ...
- Java类中static的用法
关于Java中static的使用有以下四种情况: 1.静态成员变量 被static修饰的成员变量,叫静态成员变量或类变量:没有被static修饰的变量,叫实例变量. 两者的区别是: ...
- C++中static数据成员详解
本文和大家分享的主要是c++中static数据成员的相关用法及源码示例,希望能帮助大家更好的学习C++. static(静态存储)数据成员 StaticTest.cpp : 定义控制台应用程序 ...
随机推荐
- Cool!12幅由小图片组成的创意图像重组作品
这里分享15幅创意插图作品,这些创意插图作品都是有成千上万的小图片组成的,很多创意广告会采用这个形式的设计.下面这组创意作品的作者是 Charis Tsevis,来自希腊的视觉设计师,擅长图像重组的创 ...
- static、final、static final 用法
1.使用范围:类.方法.变量.2.区别和联系:2.1.static 含义:静态的,被 static 修饰的方法和属性只属于类不属于类的任何对象.2.2.static 用法:2.2.1.static 可 ...
- .Net魔法堂:发个带附件的邮件
一.前言 由于工作需要最近把邮件发送封装成WebService,现在把代码记录在此,以便日后查阅. 二.二话不说写代码 private void _SendMail(string form, st ...
- 高级四则运算器—结对项目反思(193 & 105)
高级四则运算器—结对项目反思(193 & 105) 本周我和一位韩国同学(71061105)一起结对编程完成了我们的结对项目——高级的小学四则运算题目生成器. PSP表格 PSP2.1 P ...
- 本学期3个sprint的团队贡献分
第一次冲刺贡献分 组员 贡献分 103马嘉诚 28 143李新佳 22 145马文其 19 120韩智豪 16 147黄鸿浩 15 第二次冲刺贡献分 组员 贡献分 103马嘉诚 23 143李新佳 2 ...
- [团队项目] Scrum 项目 3.0 SCRUM 流程的步骤2: Spring 计划
SCRUM 流程的步骤2: Spring 计划 1. 确保product backlog井然有序.(参考示例图1) 2. Sprint周期,一个冲刺周期,长度定为两周,本学期还有三个冲刺周期. 3 ...
- mysql中如何把字符串转换成日期类型
select date_format('2013-03-09','%Y-%m-%d'); select date_format('2013-03-09','%y-%m-%d'); select STR ...
- struts2中struts.xml配置文件详解【未整理】
1. 深入Struts2的配置文件 本部分主要介绍struts.xml的常用配置. 1.1. 包配置: Struts2框架中核心组件就是Action.拦截器等,Struts2框架使用包来管 ...
- Google Code jam Qualification Round 2015 --- Problem A. Standing Ovation
Problem A. Standing Ovation Problem's Link: https://code.google.com/codejam/contest/6224486/dashbo ...
- Java知识点总结(不定时更新)
1.基于分代的垃圾收集算法 设计思路:把对象按照寿命长短来分组,分为年轻代和年老代,新创建的对象被分在年轻代,如果对象经过几次回收后仍然存活,那么再把这个对象划分到年老代.年老代的收集频率不像年轻代那 ...