在类中定义变量时,不会开辟存储空间,只有类定义一个对象时才会开辟类中成员变量的内存空间,且建立一个对象开辟一次,大小与类中的成员变量及函数有关。而static在静态区开辟内存空间,不占用内存空间。

1.函数内部的静态变量

  在程序运行时,我们有时候希望一个变量的值在函数两次调用时他能分别保持上一次运行的结果,而不是每次调用都初始化为初值,实现这样的效果可以通过定义一个全局变量来实现,但是这个全局变量不仅这个函数可以使用,别的函数同样也可以改变它的值,不能完全保证只受一个函数控制,但是,如果在函数内部定义一个static变量,这个变量存储在静态数据区,而不是堆栈中,这个变量只在函数第一次调用时初始化一次,以后它将在两次函数调用之间保持它的值。

2.函数内部的静态对象

  在类中,用户自定义类型,必须用构造函数初始化。因此,如果在定义一个静态对象是时没有指定构造函数参数,这个类必须有默认的构造函数。

 class X{
int i;
public:
X(int ii = ) : i(ii) { }//默认构造函数
~X();
}; void f()
{
static X x1();//有参构造i=47;
static X x2;//调用默认的构造函数i=0;
} int main()
{
f();
//程序调用f()时,只有第一次调用才需要执行构造函数,即只初始化一次。
}

3.控制连接

  有时候想让一个变量在文件范围内是可见的,这个文件内的所有函数都可以使用它,但不想让这个文件之外的函数看到或访问该变量,不与外部标识符冲突。就可以使用sataic在.cpp中来限制变量,这样,这个变量只局部与该单元,在其它翻译单元中可以使用同样的名字而不会冲突。

4.定义静态数据成员

  在类的数据成员中如果是静态常量(static const)可以在类内提供定义赋值初始化,但是对于全部类型的数组(即使是静态常量数组)必须为其提供专门的外部定义。

 class WithStatic
{
static int x;//在类中声明,实现中定义(是静态,但非常量),类的静态数据成员有单独的存储空间,不管产生了多少个对象。
static int y;
static const int scsize[ ];// 静态数组必须在类的内部声明,实现中定义赋值初始化,
static int sxsize[ ];//不能在声明时定义初始化。;
static const int z=;// 静态常量可以在类中声明时定义初始化,
static const int w; //也可以类中声明,实现中定义初始化。
Public:
void print() const
{
cout << x << endl;
cout << y << endl; } }; int WithStatic::x = ;
//定义必须出现在类的外部,且只能定义一次,最终使用由类的构造者控制
int WithStatic::y = ;
const int WithStatic::scsize[ ] = { ,,,};
//数组的定义也只能在类的外部实现。
int WithStatic::sxsize[ ] = { ,,,};
const int WithStatic::w=;//常量也可以在类的外部实现。 int main()
{
WithStatic ws;
ws.print(); }

5.静态成员函数

  像静态数据成员一样,静态成员函数为类的全体对象服务,而不是某个特殊对象的专属,这样就不需要定义一个全局函数,而是移到了类的内部起到到全局的作用。静态成员函数一般用类域(类名::函数名())去调用,从概念上体现静态成员函数为整个类所有。

 class X
{
Public:
static void f();
}; int main()
{
X::f();
//静态成员函数可以自我调用,加上作用域限制符即可。它同样也可以由类的对象.或->去调用,但是普通成员函数只能通过对象调用。
}

  静态成员函数不能访问一般的数据成员(没有默认的this指针),只能访问静态数据成员,也只能调用其他的静态成员函数。

 class X
{
int i;
static int j;
public: X(int ii = ) : i(ii)
{
j=i;
} int val() const { return i;} static int incr()
{
i++;//非法访问,i不是静态变量。
j++;//正确
return j;
} static int f()
{
val();//非法,val()不是静态函数。
return incr().
} }; int X::j = ;//定义初始化 int main()
{
X x;
X* ip = &x;
x.f();
ip->f();
X::f();
}

static静态不是很静的更多相关文章

  1. C#中static静态变量的用法

    使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类.字段.方法.属性.运算符.事件和构造函数,但不能用于索引器.析构函数或类以外的类型 静态全局变量 定义 ...

  2. [转] C# 中的static静态变量

    logitechyan原文关于C#中static静态变量 C#静态变量使用static 修饰符进行声明,在类被实例化时创建,通过类进行访问不带有 static 修饰符声明的变量称做非静态变量,在对象被 ...

  3. 关于C#中static静态变量

    C#静态变量使用static 修饰符进行声明,在类被实例化时创建,通过类进行访问不带有 static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问一个类的所有实例的同一C#静 ...

  4. C#中的static静态变量的用法

    静态全局变量 定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量. 特点: A.该变量在全局数据区分配内存. B.初始化:如果不显式初始化,那么将被隐式初始化为0. 静 ...

  5. Java 基础之 static 静态

    static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ...

  6. static{}静态代码块与{}普通代码块之间的区别

    先看一个例子: //class A package com.my.test; class A { static { System.out.println("A1:父类静态代码区域" ...

  7. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第6节 static静态_15_静态代码块

    static的特殊用法, 静态代码块 加上构造方法,做测试 又创建一个对象 静态代码块 只执行一次 后续在学习jdbc的时候,静态代码块很有用途.

  8. jvm源码解读--09 创建oop对象,将static静态变量放置在oop的96 offset处 第二篇

    先打断点systemDictionary.cpp 1915行 Universe::fixup_mirrors(CHECK); 进入 void Universe::fixup_mirrors(TRAPS ...

  9. jvm源码解读--08 创建oop对象,将static静态变量放置在oop的96 offset处

    之前分析的已经加载的.Class文件中都没有Static 静态变量,所以也就没这部分的解析,自己也是不懂hotspot 将静态变量放哪里去了,追踪源码之后,看清楚了整个套路,总体上来说,可以举例来说对 ...

随机推荐

  1. SOA(Service-Oriented Architecture):面向服务的架构

    SOA (Service-Oriented Architecture):面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联 ...

  2. VSCode 完美整合前后端框架(angular2+.NET core)

    首先打开命令行查看本地.NET版本. 通过命令行安装模板. dotnet new --install Microsoft.AspNetCore.SpaTemplates::* 创建demo目录,并用v ...

  3. 详细讲解Codeforces Round #624 (Div. 3) F. Moving Points

    题意:给定n个点的初始坐标x和速度v(保证n个点的初始坐标互不相同), d(i,j)是第i个和第j个点之间任意某个时刻的最小距离,求出n个点中任意一对点的d(i,j)的总和. 题解:可以理解,两个点中 ...

  4. 搜索练习题LETTERS

    题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1212    或者http://poj.org/problem?id=1154 题目描述: 给 ...

  5. 为什么我用Ipad Pro做电子笔记和看PDF电子书

    为什么我用Ipad Pro做电子笔记和看PDF电子书 Ipad做笔记的优点: 1.ipad整理的笔记可以随时修改,可以看PDF的书,2.纸质书很重携带不便3.ipad的可通过关键词搜索笔记内容 4.笔 ...

  6. ADO.NET事务封装

    在数据库工具类编写的过程中,对事务的处理操作想避免各个原子操作的事务对象赋值重复操作,想对外暴露的方法为如下形式 public bool ExecuteTransition(Action Transi ...

  7. Java多线程之互斥锁Syncharnized

    public class Bank { private int money; private String name; public Bank(String name, int money) { th ...

  8. MySQL基础入门使用和命令的使用

    数据库了解 概念 数据库就是一种特殊的文件,其中存储着需要的数据 一个数据库可以有多张表 MySQL是一种关系型数据库 具有关联性数据的就是关系型数据库 MySQL是一种软件可以用来创建mysql数据 ...

  9. qt creator源码全方面分析(2-2)

    目录 Common Extension Tasks Common Extension Tasks 本节总结了可用于将UI组件添加到Qt Creator的API函数. 任务 详细 API 添加菜单或菜单 ...

  10. #AcWing系列课程Level-2笔记——1. 快速排序算法

    快速排序算法(冒泡排序算法的升级版) 编写快速排序,记住下面的思路,代码也就游刃有余了! 1.首先确定分界点:分界点设为x,可以取q[left],q[(left+right)>>2],q[ ...