一、一般类型的类的静态变量

1.首先看下面的代码:

class CTest1
{
public:
static int m_num1;
void printNum(){cout << m_num2 << endl;};
void SetNum2(int i){m_num2 = i;};
static void printNum2(){cout << m_num2 << endl;};
static void printNum3(){cout << m_num3 << endl;}; private:
static int m_num2;
protected:
static int m_num3; }; int CTest1::m_num1 =1;
int CTest1::m_num2 =2;
int CTest1::m_num3 =3; int main()
{
cout << CTest1::m_num1 << endl;
//cout << CTest1::m_num2 << endl;//这样编译报错
//cout << CTest1::m_num3 << endl;//这样编译报错
CTest1::printNum2();//通过静态函数打印
CTest1::printNum3();//通过静态函数打印 CTest1 t1;
t1.printNum(); CTest1 t2;
t2.printNum(); t1.SetNum2(20);
t1.printNum();
t2.printNum(); t2.SetNum2(30);
t1.printNum();
t2.printNum(); CTest1::m_num1 = 10; return 0;
}

2.测试结果:

1
2
3
2
2
20
20
30
30

3.结论:

1).public类型的类的静态变量,可以在类外面进行初始化,也可以在别的函数里通过“类名::变量”(比如:CTest1::m_num1)进行访问和操作。

2).private、protected,可以在类外面进行初始化,不能通过“类名::变量”访问和操作,可以定义public类型的静态函数,通过“类名::函数”进行访问和操作;也可以通过定义类的对象,通过对象调用函数来访问和操作。

3).类的静态变量,在一个对象(或者类外)改变和操作后,其他所有的地方都会相应改变,比如t1和t2的操作。

这个特点可以用来计算一个类的对象被使用了多少次,变量初始化为0,比如new的时候变量++,delete的时候变量--,当变量为=0时候,可以销毁这个类的对象。

二、const类型的类的静态变量

1.首先看下面的代码:

class CTest2
{
public:
CTest2(int i, char* str)
{ }
static const int m_num1;//static const int m_num1 =16;//VC中这样不行
static const char* m_name;//static const char m_name[m_num1];//VC中这样不行
}; const int CTest2::m_num1 =1;
const char* CTest2::m_name="121212"; int main()
{
cout << CTest2::m_num1 << endl; //CTest2::m_num1 =10;//这样会编译报错。 return 0;
}

2.结论

public类型的类的const类型的静态变量,可以在类外面进行初始化,也可以在别的函数里通过“类名::变量”(比如:CTest1::m_num1)进行访问,但不能被改变,这个是const的特性。

转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/12193551

C++类静态成员的初始化和用法探讨的更多相关文章

  1. 【随笔】C++类静态成员变量初始化引发的惨痛教训

    事情是这样的,我在某个类中声明了一个静态的map成员, 文件名暂且称之为 xxx.h 然后在 xxx.cc 中全局定义了这个东西,静态成员在类里面只是声明,需要在外边被定义才有内存 然后又在main. ...

  2. C++类静态成员变量和const常量的初始化方法

    C++类静态成员变量和const常量在定义类的时候就必须初始化,否则都会编译出错. 而具初始化方法为: C++类静态成员变量初始化方法 #include <iostream> #inclu ...

  3. C#类的成员初始化顺序

    首先我们来看看引用类型的成员初始化过程 我们来看一个例子吧 class Program {     static void Main(string[] args)     {         Driv ...

  4. 11.c#类的成员初始化顺序

    转自http://www.cnblogs.com/siceblue/archive/2009/01/15/1376430.html C#作为一种纯面向对象的话言,为它编写的整个代码里面到处都离不开对象 ...

  5. c++ 类静态成员、非静态成员初始化

    1.静态成员初始化(不能在构造函数或初始化列表中初始化) 1.1 所有静态成员都可以在类定义之外初始化(通用),如下所示 class test { public: static int a; }; ; ...

  6. 吐槽C++:C++ 类成员变量初始化 之 初始化带有参数的构造函数 的类成员变量。

    本来我想写这样的代码: class MatchManager{ public: MatchManager() { } class OnTimerRunFuncHelper{ public: OnTim ...

  7. Java 类成员的初始化顺序

    Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究.   1  无继承情况下的Jav ...

  8. C++类静态成员与类静态成员函数

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

  9. Java构造方法、成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的?

    [Java笔试真题]:构造方法.成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的? [解答]:当类第一次被加载的时候,静态变量会首先初始化,接着编译器会把实例变量初始化为默认值,然后执行构 ...

随机推荐

  1. ios 数组倒序和数组转字符串

    NSMutableArray *array = [NSMutableArray arrayWithObjects:",nil]; NSArray* reversedArray = [[arr ...

  2. 再探java基础——对面向对象的理解(1)

    对象 对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则.计划或事件.对象具有属性和行为,在程序设计中对象实现了数据和操作的结合,使数 ...

  3. POJ 3254 Corn Fields (状态压缩DP)

    题意:在由方格组成的矩形里面种草,相邻方格不能都种草,有障碍的地方不能种草,问有多少种种草方案(不种也算一种方案). 分析:方格边长范围只有12,用状态压缩dp好解决. 预处理:每一行的障碍用一个状态 ...

  4. 应用按home键无最近应用

    在应用的AndroidManifest里面添加加载模式

  5. Tips:javascript 图片放大和取得尺寸

    1)获取图片尺寸 <img src="http://img.my.csdn.net/uploads/201309/03/1378223257_7957.jpg" alt=&q ...

  6. HashMap学习笔记

        概述   HashMap是Map接口的一个哈希表的实现,内部是一个数组表示的.数组中的元素叫做一个Node,一个Node可以一个是一个简单的表示键值对的二元组,也可以是一个复杂的TreeNod ...

  7. .NET基础拾遗(7)多线程开发基础4

    一.多线程编程中的线程同步 1.C#中的lock关键字 lock关键字可能是我们在遇到线程同步的需求时最常用的方式,但lock只是一个语法糖,为什么这么说呢,下面慢慢道来. (1)lock的等效代码其 ...

  8. Tree( 树) 组件[1]

    本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件. 一. 加载方式//class 加载方式<ul c ...

  9. (转)passwordStrength 基于jquery的密码强度检测代码使用介绍

    使用很简单. 代码如下: $('#pass').passwordStrength();  XHTML 代码如下: <p><label>请输入密码:</label>  ...

  10. Wireshark对ping报文的解码显示(BE与LE) 转自作者:易隐者

    Wireshark对ping报文的解码显示(BE与LE) 我们非常熟悉ping报文的封装结构,但是,在这个报文解码里,我们发现wireshark的解码多了几个参数:Identifier(BE).Ide ...