C++类中的静态成员变量与静态成员函数

静态成员变量
概念:
  • 静态成员属于整个类,在内存中只有一份空间,位于全局区(静态区)中,可以在所有对象中共享它。
  • 静态成员变量是类作用域的静态变量
    • 静态:指在程序开始时就为其分配内存空间,程序结束时才释放
    • 类作用域:指在类内部可以被直接调用,在类外部可以通过作用域操作符 class name::或对象object. *object-> 调用
定义(初始化)位置:
  • 类的声明仅仅是一种类型的声明,类中的所有成员变量(静态/非静态)也仅仅是一种声明,都不是定义
  • 非静态成员变量在某一对象创建时被定义(即分配内存),并由构造函数初始化
  • 类中的静态成员变量本质上只是说明了该变量的持续性和作用域,而不是定义
  • 因为变量不能重定义,因此静态成员变量不能在类中,构造函数中定义(初始化),因为每个对象创建时都会执行一次;也不要在头文件中定义(初始化),因为头文件可能被包含多次
  • 所以静态成员变量一般在类的外部,唯一的源文件中进行定义(初始化),并且要放在任何代码块之外,即文件(全局)作用域中,否则会被认为重定义。
    • 初始化格式  type class::variable = value;
    • private 的 静态成员变量,也一样在类的外部初始化,因为初始化不受存取权限的束缚。
    • 关键是要定义,即分配内存空间。如初始化语句不赋值,只写 type class::variable; 在VC中也是可以编译通过的,因为这里定义了这个全局变量,分配了内存空间,编译器会自动赋予一个废值(全局变量赋0)
  • 特例:若静态成员变量是整型或是枚举型const,则可以在类声明中初始化!(为什么?)
    • 解释(来自网上):普通成员变量只是一个记号,并没有一个对应的链接符号(被连接器识别的符号),但是静态成员变量不同,它实际上是一个链接符号,所以不能在头文件中定义(只能声明),不然就会在链接时出现符号重定义错误,这是C++要求指定唯一一个源文件定义静态成员变量的原因。如果是const静态成员变量就不会产生链接符号,编译器直接常量替换,所以可以随类一起定义。

静态成员函数
概念
  • 类的成员函数(包括静态/非静态)和一般函数一样,都存放在代码区,所有对象共享一个副本
  • 非静态成员函数有一个隐藏参数this*指针,用以标明其属于的对象
  • 静态成员函数不属于某个对象,而是属于整个类,因此没有 this 指针
  • 和静态成员变量一样,在类内部可以被直接调用,在类外部可以通过作用域操作符 class name::或对象object. *object-> 调用
特点
  • 静态成员函数中不能直接调用非静态成员变量。因为非静态成员变量只有在对象创建时才分配内存静态成员函数不需要类的实例就可以调用,即通过 class name::调用
    • 但可以通过形参传递进来的具体对象来调用非静态成员变量
  • 静态成员函数不能被声明为virtual
 
posted @ 2012-11-22 17:42  ayanamaist  阅读(2176)  评论(0编辑  收藏  举报