1,成员变量的回顾:

1,通过对象名能够访问 public 成员变量;

2,每个对象的成员变量都是专属的;

3,成员变量不能在对象之间共享;

1,在做程序设计中,成员变量一般是私有的、至少不是公有的;

2,新的需求:

1,统计在程序运行期间某个类的对象数目;

2,保证程序的安全性(不能使用全局变量);

3,随时可以获取当前对象的数目;

3,解决方案的尝试编程实验:

 #include <stdio.h>

 int gCount = ;

 class Test
{
private:
int mCount; public:
Test() : mCount()
{
// mCount++;
gCount++;
} ~Test()
{
// --mCount;
gCount--;
} int getCount()
{
// return mCount;
return gCount; // 类的成员函数中可以调用全局变量,全局变量在类的任何地方都可以访问和改变它;
}
}; Test gTest; int main()
{
Test t1;
Test t2; /*
printf("count = %d\n", gTest.getCount()); // 打印 1,成员变量每个类各有一个,先被初始化为 0,后加加;
printf("count = %d\n", t1.getCount()); // 打印 1 ,成员变量、每个类各有一个,先被初始化为 0,后加加;
printf("count = %d\n", t2.getCount()); // 打印 1,成员变量、每个类各有一个,先被初始化为 0,后加加;
*/ printf("count = %d\n", gTest.getCount()); // 打印 3;
printf("count = %d\n", t1.getCount()); // 打印 3;
printf("count = %d\n", t2.getCount()); // 打印 3; return ;
}

1,不可以使用全局变量,全局变量在当代软件开发中是不受欢迎的,因为它不     够安全,任意地方都可以访问和修改,舍弃;

4,静态成员变量:

1,在 C++ 中可以定义静态成员变量:

1,静态成员变量属于整个类所有;

1,不是隶属于某个对象所有;

2,静态成员变量的生命期不依赖于任何对象;

1,其生命期如同全局变量一样,静态成员变量的生命期是程序的运行周期;

3,可以通过类名直接访问共有静态成员变量;

1,静态成员变量也有访问等级;

4,所有对象共享类的静态成员变量;

5,可以通过对象名访问公有静态成员变量;

5,静态成员变量的特性:

1,在定义时直接通过 static 关键字修饰;

2,静态成员变量需要在类外单独分配空间;

1,其隶属于整个类,不可能占用对象的空间;

2,只能在类的外部单度分配空间;

3,静态成员变量在程序内部位于全局数据区;

1,全局数据区保存已初始化的全局变量或静态局部变量;

2,静态成员变量和全局变量、静态局部变量是一致的,存储在同一个地方,但是只有在类的外部重新定义静态成员变量才可以存储到静态存储区;

3,静态存储变量一般的会初始化,所以其存储在全局数据区;

4,语法规则:

 1,Type ClassName::VarName = value;

 2,是在类的外部直接定义出来;

6,静态成员变量的使用编程实验:

 #include <stdio.h>

 class Test
{
private:
static int cCount; // 得到静态成员变量;这里编译器显示没有办法访问到 Test::cCount,也就是说链接器链接的时候找不到 Test::cCount 的存储空间;静态成员变量不隶属于任何的对象,因此要单独定义它,使得编译器知道这个静态成员变量需要在全局数据区分配空间;见下面注释; public:
Test()
{
cCount++;
} ~Test()
{
--cCount;
} int getCount()
{
return cCount;
}
}; int Test::cCount = ; // 需要在类的外部单独定义,以便为它分配空间;要用作用域分辨符告诉编译器 cCount 隶属于 Test 这个类; Test gTest; int main()
{
Test t1;
Test t2; printf("count = %d\n", gTest.getCount()); //
printf("count = %d\n", t1.getCount()); //
printf("count = %d\n", t2.getCount()); // Test* pt = new Test(); printf("count = %d\n", pt->getCount()); // delete pt; printf("count = %d\n", gTest.getCount()); // return ;
}

7,小结:

1,类中可以通过 static 关键字定义静态成员变量;

2,静态成员变量隶属于类所有;

3,每一个对象都可以访问静态成员变量;

4,静态成员变量在全局数据区分配空间;

1,静态成员变量不像静态局部变量一样可以直接保存到静态存储区,所以还要在类外部定义静态存储变量,以便能够给其分配到静态存储区里面;

5,静态成员变量的生命周期为程序运行期;

C++中类的静态成员变量的更多相关文章

  1. c++ 静态成员变量

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...

  2. C++中类的静态成员与实例成员的区别

    C++中类的静态成员与实例成员的区别 1.有static修饰的成员变量或成员函数称为静态成员. 2.在内存中,类的静态数据成员占有一块特定的内存空间,被该类的所有实例(对象)共享.而同一个类的不同对象 ...

  3. spring注入静态成员变量提示invalid setter method

    果然还是不够细心啊,被坑一晚上.. 一个极其简单的小程序,但是需要通过xml文件配置注入一个值,唯一的特别是要注入的属性是类中的静态成员变量.. 如下,然后自动生成get和set方法..坑就从此开始了 ...

  4. C#泛型-小心使用静态成员变量

    对于泛型类的声明 其中使用类型参数的构造类型,比如List<T>被称为开放构造类型(open constructed type)而不使用类型参数的构造类型,例如List<int> ...

  5. C++@类的静态成员变量和静态成员函数

    参考: http://blog.csdn.net/morewindows/article/details/6721430 http://www.cnblogs.com/lzjsky/archive/2 ...

  6. C++学习10 static静态成员变量和静态成员函数

    一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干.但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享. 可以使用全局 ...

  7. 静态成员变量.xml

    pre{ line-height:1; color:#1e1e1e; background-color:#f0f0f0; font-size:16px;}.sysFunc{color:#627cf6; ...

  8. java:静态成员变量和静态函数

    静态成员变量 可以使用类名调用,如 class Dog { static int age; } class Test2{ public static void main(String args[]){ ...

  9. C++类中的静态成员变量与静态成员函数的使用

    代码: #include <iostream> #include <string> #include <cstdio> using namespace std; c ...

随机推荐

  1. js的预解析和作用域

    预解析指的就是,在js文件或者script里面的代码在正式开始执行之前,进行的一些解析工作.这个工作很简单,就是在全局中寻找var关键字声明的变量和通过function关键字声明的函数. 1.寻找 v ...

  2. zabbix3.4.8配置自动发现主机并监控

    一.       自动发现功能简介 Zabbix服务器端通过网络或者主机名等方式进行客户端的扫描发现,从进行加入到监控的主机队列中,适用于批量加入多主机监控的场景. 二.       自动发现功能实施 ...

  3. win10 护眼

  4. python路径引用r的含义

    input_file = r"C:\Users\Administrator\Desktop\python-master\csv\supplier_data.csv"#r代表不转义, ...

  5. JDBC之Statement、PreparedStatement和CallableStatement

    JDBC提供了Statement.PreparedStatement和CallableStatement三种方式来执行查询语句,其中Statement用于通用查询,PreparedStatement用 ...

  6. python socket基本连接功能实现

    socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信 在应用中,要写两个程序来通信,一个是服务器端程序,一个是客户端程序 ...

  7. pythonerror ValueError:invalid literal for int() with base 10: '3.14'

    解释:对于int()来说,文本输入‘3.14’这个输入是无效的,原因是int类要求输入数字或者整数字符 解决:a= int(float(value)) 注:int本身是一个类,所以返回的是int类,i ...

  8. python3.x运行的坑:AttributeError: 'str' object has no attribute 'decode'

    1.Python3.x和Python2.X版本有一些区别,我遇到了两个问题如下: a.第一个报:mysqlclient 1.3版本不对: 解决办法:注释掉这行即可: b.第二个报:字符集的问题: 报错 ...

  9. 阿里下一代云分析型数据库AnalyticDB入选Forrester云化数仓象限

    前言 近期, 全球权威IT咨询机构Forrester发布"The Forrester Wave: CloudData Warehouse Q4 2018"研究报告,阿里巴巴分析型数 ...

  10. STM32输入捕获TIM2四通道

    相比于一通道,原子的例程里因为清了计数时间,所以要对程序进行修改. 记录上升沿后的计数,然后记录下降沿的计数.相减后计算高电平时间,对于定时器中断间隔的边界要分开处理. 这里因为我的接收机时间是1ms ...