C++学习之静态成员

Posted 小凉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++学习之静态成员相关的知识,希望对你有一定的参考价值。

一、静态数据成员

  C++允许将类的数据成员定义为静态成员。静态数据成员是属于类的,整个类只有一个备份,相当于类的全局变量,能够被该类的所有对象共用。

  1.静态成员的声明

  在类数据成员的声明前加上关键字static,就将该成员指定成了静态数据成员。静态数据成员遵守public、private、protected访问权限的限定规则。如:

 1 class Account
 2 {
 3    public:
 4             Account();  //构造函数
 5             ~Account();  //析构函数
 6     //.....................
 7    private:
 8            static int number;  //静态数据成员声明
 9     //.....................
10 }    

  2.静态数据成员的定义

  在类的声明中将数据成员指定为静态成员,只是一种声明,并不会为该成员分配内存空间,在使用之前应该对他进行定义。静态数据成员常常在类外进行定义,与类成员函数的定义方法一样。定义形式如:  

1 //类型  类名::静态成员名;
2 //类型 类名::静态成员名 = 初始值
3 int Account::number;  //定义静态成员并初始化为0

  注意:(1)在类外定义静态数据成员时,不能加上static限定词

     (2)在定义静态数据成员时可以指定他的初始值,若定义是没有指定初始值,系统将会自动赋上默认值

  3.静态数据成员的访问

  静态成员属于整个类,如果将他定义为类的公有成员,在类外可有两种方式访问。

  a)通过类名访问

    类名::静态成员名

  b)通过对象访问

    对象名.静态成员名

  4.静态数据成员与非静态数据成员的区别

  (1)非静态数据成员与对象关联,每个对象拥有独立的数据成员备份。静态数据成员与类关联,整个类只有一份静态数据成员备份,由全类所有对象共用。(C++会为对象的非静态数据成员分配独立的内存空间,而静态数据成员在内存中则只分配一次)

  (2)非静态数据成员只有在定义了对象之后才存在(也就是分配内存空间)。静态数据成员不属于单个对象,即使没有定义他所属类的任何对象时,就已经存在了。

  (3)非静态数据成员的作用域限定在定义对象的块作用域内,静态数据成员自他的定义开始到程序结束之前有效。

 

二、静态成员函数

  在类成员函数的原型前面加上static就将他定义成了静态成员函数。静态成员函数属于整个类,他只能访问该类的静态成员(包括静态数据成员和静态成员函数),不能访问非静态成员(包括非静态数据成员和非静态成员函数)。

  1.静态成员函数的声明定义

 1 class Account
 2  {
 3     public:
 4              Account();  //构造函数
 5              ~Account();  //析构函数       
 6      //.....................
 7          static int getNumber()  //定义静态成员函数
 8        {
 9           return number; //访问静态数据成员
10        }
11 
12      private:
13             static int number;  //静态数据成员声明
14      //.....................
15  }    

  2.调用方式

  静态成员函数的调用方式有两种:

  a)类调用方式

    类名::静态成员函数名(参数表);

  b)对象调用

    对象名.静态成员函数名(参数表);

  3.特别注意

  (1)和普通成员函数一样,静态成员函数也可以在类内或类外定义,还可以定义成内联函数

  (2)静态函数只能访问静态成员(包括静态数据成员和静态成员函数),不能访问非静态成员(包括非静态数据成员和非静态成员函数)

  (3)在类外定义静态成员函数时,不能加上static限定词

  (4)静态成员函数可以在定义类的任何对象之前被调用,非静态成员只有在定义对象后,通过对象才能访问

 

 

 

 

ps:如果有什么不对的地方,希望各位前辈同行能够批评指出,本人将感激不尽!!!!

以上是关于C++学习之静态成员的主要内容,如果未能解决你的问题,请参考以下文章

Java基础学习之--继承+访问权限

python 基础学习之动态语言初识

JUC学习之共享模型上

前端学习之静态网页的制作

驱动学习之静态映射和动态映射

深度探索C++对象模型——Function语意学