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

    静态数据成员的用途之一是统计有多少个对象实际存在。
    静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的。也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一个类的对象则静态数据成员都要被重新初始化。
    静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值。
    静态成员的值对所有的对象是一样的。静态成员可以被初始化,但只能在类体外进行初始化。
    一般形式:
    数据类型类名::静态数据成员名=初值
    注意:不能用参数初始化表对静态成员初始化。一般系统缺省初始为0。

    静态成员是类所有的对象的共享的成员,而不是某个对象的成员。它在对象中不占用存储空间,这个属性为整个类所共有,不属于任何一个具体对象。所以静态成员不能在类的内部初始化,比如声明一个学生类,其中一个成员为学生总数,则这个变量就应当声明为静态变量,应该根据实际需求来设置成员变量。
#include "iostream"
using namespace std;
class test
{
private:
     int x;
     int y;
public:
     static int num;
     static int Getnum()
     {
          x+=5;   // 这行代码是错误的,静态成员函数不能调用非静态数据成员,要通过类的对象来调用。
          num+=15;
          return num;
     }
};
int test::num = 10;
int main(void)
{
     test a;
     cout<<test::num<<endl;        //10
     test::num = 20;
     cout<<test::num<<endl;        //20
     cout<<test::Getnum()<<endl;   //35
     cout<<a.Getnum()<<endl;       //50
     system("pause");
     return 0;
}
    通过上例可知:  x+=5;   // 这行代码是错误的
    静态函数成员必须通过对象名来访问非静态数据成员。
    另外,静态成员函数在类外实现时候无须加static关键字,否则是错误的。
    若在类的体外来实现上述的那个静态成员函数,不能加static关键字,这样写就可以了:
     int test::Getnum()
     {
       .........
     }

1、static成员的所有者是类本身和对象,但是多有对象拥有一样的静态成员。从而在定义对象是不能通过构造函数对其进行初始化。
2、静态成员不能在类定义里边初始化,只能在class body外初始化。
3、静态成员仍然遵循public,private,protected访问准则。
4、静态成员函数没有this指针,它不能返回非静态成员,因为除了对象会调用它外,类本身也可以调用。
 

静态成员函数可以直接访问该类的静态数据和函数成员,而访问非静态数据成员必须通过参数传递的方式得到一个对象名,然后通过对象名来访问。

class Myclass { private:         int a,b,c;         static int Sum;    //声明静态数据成员 public:         Myclass(int a,int b,int c);         void GetSum(); }; int Myclass::Sum=0;       //定义并初始化静态数据成员 Myclass::Myclass(int a,int b,int c) {         this->a=a;         this->b=b;         this->c=c;         Sum+=a+b+c; } void Myclass::GetSum() {         cout <<"Sum=" <<Sum <<endl; } int main(void) {         Myclass me(10,20,30);         me.GetSum();         system("pause");         return 0; }

由上例可知,非静态成员函数可以任意地访问静态成员函数和静态数据成员。 非静态成员函数Myclass(int a,int b,int c)和GetSum()都访问了静态数据成员Sum。 静态成员函数不能访问非静态成员函数和非静态数据成员。

关于静态成员函数,可以总结为以下几点: 出现在类体外的函数定义不能指定关键字static; 静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数; 非静态成员函数可以任意地访问静态成员函数和静态数据成员; 静态成员函数不能访问非静态成员函数和非静态数据成员; 由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长; 调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数, 当同一类的所有对象使用一个量时,对于这个共用的量,可以用静态数据成员变量,这个变量对于同一类的所有的对象都取相同的值。静态成员变量只能被静态成员函数调用。静态成员函数也是由同一类中的所有对象共用。只能调用静态成员变量和静态成员函数。

转载于:https://www.cnblogs.com/hualimengyu/p/3739599.html

类的静态成员函数和静态成员变量的使用相关推荐

  1. c语言静态成员变量重名会怎么样,C++中静态成员函数与静态成员变量(static )...

    C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用.如果有一些C++知识记不清楚了,它可以帮你很快回 ...

  2. 友元函数、类的非静态成员函数、静态成员函数的区别

    类中申明的函数相对于类来说有三层意思: 1.有this指针 2.函数在类的作用区域中 3.可以访问类中私有部分 4.可以被继承 非静态成员函数具有1234 静态成员函数具有234 友元函数具有3 静态 ...

  3. 静态成员函数与静态成员变量

    此文针对于初学者或者对这一部分掌握不太清楚的人. 首先静态成员函数的声明: static void setName(QString name); 需要在函数的声明前加static关键字. 定义的时候和 ...

  4. 静态成员函数与成员变量_C++静态成员变量及函数

    没有很快乐,也没有不快乐,好像不该这样,但也只能这样,成长也许如此,行于奔溃边缘又慢慢自愈吧... ----  网易云热评 一.静态成员变量 1.普通成员变量属于对象,每个对象都会包含一份独立的普通成 ...

  5. C++静态成员函数与静态成员变量

    静态成员函数的作用 调用这个函数不会访问或者修改任何对象(非static)数据成员 不需要生成对象就能调用 原因: 类的静态成员(变量/方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去 ...

  6. C++_类和对象_对象特性_成员变量占用对象内存_成员函数_静态成员函数_静态变量_都不占用对象内存_他们是分开存储的---C++语言工作笔记048

    然后我们来看c++中的,类的对象的大小,类中的成员变量和函数的存储问题. 首先我写个空类 然后在类外写个test01这个函数,然后 在main方法中调用这个test01这个函数

  7. 类中的静态成员变量和静态成员函数

    static静态成员函数 1.static 修饰成员变量 2.static修饰静态成员函数 引子: 静态成员函数: 注意: 3.const 修饰静态成员 静态成员案例 案例1:静态成员 统计类 实例化 ...

  8. 【C++基础学习】关于C++静态成员函数和变量

    代码一: class Point{ public:void output(){}static void init(){} }; int main() {Point pt;pt.init();pt.ou ...

  9. 13.C++-静态成员变量、静态成员函数

    首先回顾下成员变量 能通过对象名能够访问public成员变量 每个对象的成员变量都是专属的 成员变量不能在对象之间共享 再来讲讲类的静态成员变量 介绍 静态成员变量属于整个类所有 静态成员变量的生命期 ...

最新文章

  1. mysql left join超时,MySQL 行锁超时排查方法优化
  2. snort源码的详细分析
  3. 给linux下网站目录配置SFTP
  4. html设置粗体字,如何在HTML输出中设置粗体字段
  5. 开始使用Power BI桌面
  6. JSTL 表达式与 EL 语言
  7. 消息服务器mq集群出现假死,排查tomcat项目假死原因的简单方法
  8. R2017b-Matlab安装教程
  9. 计算机应用教程 卢湘鸿答案,计算机应用教程(Windows 2000环境)习题解答与实验指导...
  10. 【学习笔记】python实现图像的手绘效果
  11. Photoshop-置换贴图-原理
  12. 深度学习之学习(1-3)Bag of Features (BOF)图像检索算法
  13. 异常:The JSP specification requires that an attribute name is preceded by whitespace
  14. js监听iframe是否加载完毕
  15. Java多线程同步和异步详解
  16. 刚入职场需要用到的5个顶尖自学网
  17. 3.3 将列表[mo,deng,ge]和[1,2,3] 转换成[(mo,1),(deng,2),(ge,3)]
  18. 主机访问虚拟机中docker安装的mysql
  19. 重邮大学计算机基础考试试题及答案,重庆邮电大学《大学计算机基础(2015》考试试卷.pdf...
  20. 创建物料凭证 BAPI_GOODSMVT_CREATE

热门文章

  1. CIF进口货物流程图_广州进口报关公司阿根廷红酒上海进口清关成本选择聚海
  2. LDA的Gibbs抽样详细推理与理解
  3. 边缘检测之Canny
  4. 摄影测量--点位精度评定
  5. 算法竞赛中的时间复杂度选择——以最大连续和问题为例
  6. JavaEE 搜索解决问题集合---会不断更新的
  7. Namomo Spring Camp Div2 Week1 - 第四次打卡
  8. 单频和混频是什么意思_科研| 谐波混频器常见电路小结
  9. 趋势科技云安全软件_阿里达摩院发布2020十大科技趋势!量子计算、类脑计算系统崛起...
  10. python中groupby()函数讲解与示例_详解python中groupby函数通俗易懂