zoukankan      html  css  js  c++  java
  • C++ 静态成员----细谈static修饰的成员

    首先,我们先通过字面意思来理解...

    成员:成员变量、成员函数。

    static  修饰成员变量,还有修饰成员函数。

    static  声明为静态的,称为静态成员。不管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被所有属于这个类的对象共享

    静态成员,属于 而不是对象。

     1.static 修饰成员变量

    静态变量,是在编译阶段就分配空间,对象还没有创建时,就已经分配空间

    静态成员变量必须在类中声明,在类外定义。

    静态数据成员不属于某个对象,在为对象分配空间中不包括静态成员所占空间。

     1 class Data
     2 {
     3 public:
     4     int num;//普通成员变量
     5     static int data;//静态成员变量(类内声明)
     6 };
     7 //定义的时候不需要加static
     8 int Data::data=100;//类外定义+初始化
     9 
    10 void tesk07()
    11 {
    12     //data是静态成员变量,是属于类,可以通过类名称::直接访问
    13     cout<<Data::data<<endl;//100
    14     //赋值
    15     Data::data = 200;
    16     cout<<Data::data<<endl;//200
    17 
    18     //data静态变量,是所有对象共享的,可以通过对象名访问
    19     Data ob1;
    20     ob1.data = 300;
    21     cout<<Data::data<<endl;//300
    22 
    23     Data ob2;
    24     cout<<ob2.data<<endl;//300
    25 
    26     //普通成员变量,属于对象的,只能通过对象名访问
    27     ob1.num = 100;
    28     cout<<"ob2.num="<<ob2.num<<endl;//随机值
    29     //cout<<Data::num<<endl;//普通成员变量不能通过类名称访问
    30 }

    2、static修饰静态成员函数

     1 class Data
     2 {
     3 private:
     4     int num;//普通成员变量
     5     static int data;//静态成员变量(类内声明)
     6 public:
     7     //普通成员函数,依赖于对象的必须对象调用
     8     int getData(void)
     9     {
    10         return data;
    11     }
    12 };
    13 
    14 //定义的时候,不需要加static
    15 int Data::data = 100;//类外定义+初始化
    16 
    17 void tesk08()
    18 {
    19     //cout<<Data::data<<endl;//err 静态data是私有的,类外不能直接访问
    20     //cout<<Data::getData()<<endl;//err getData() 必须对象调用
    21     
    22     Data ob;
    23     cout<<ob.getData()<<endl;
    24     //存在问题:data静态的,在创建对象之前就已经存在
    25 }
    存在问题:data静态的 在创建对象之前 就已经存在
        如果类没有实例化对象 难道 就不能使用data了吗? 
        解决上述问题 就要用到静态成员函数

    静态成员函数:
     1 class Data
     2 {
     3 private:
     4     int num;//普通成员变量
     5     static int data;//静态成员变量(类内声明)
     6 public:
     7     //普通成员函数,依赖于对象的必须对象调用
     8     int getData(void)
     9     {
    10         return data;
    11     }
    12     
    13     //静态成员函数,属于类,而不属于对象
    14     static int getDataStatic(void)
    15     {
    16         return data;
    17     }
    18 };
    19 
    20 //定义的时候,不需要加static
    21 int Data::data = 100;//类外定义+初始化
    22 
    23 void tesk08()
    24 {
    25     //cout<<Data::data<<endl;//err 静态data是私有,类外不能直接访问
    26     //cout<<Data::getData()<<endl;//err getData()必须是对象调用
    27     
    28     Data ob;
    29     cout<<ob.getData()<<endl;
    30     
    31     //1.静态成员函数,属于类,就可以通过类名称直接访问
    32     cout<<Data::getDataStatic()<<endl;
    33     
    34     //2.也可以通过对象名访问(对象共享静态成员函数)
    35     cout<<ob.getDataStatic()<<endl;
    36 }
    
    

    注意:

      1.静态成员函数的目的,操作静态成员数据

      2.静态成员函数,不能访问非静态成员数据。

     3、普通成员函数 可以操作 静态成员数据 非静态成员数据。

     4.静态成员变量和静态成员函数 都有权限之分

    -------------------------------
    3.const修饰静态成员
    如果一个类的成员,既要实现共享,又要实现不可改变,那就要用static const修饰
     1 class Data
     2 {
     3 public:
     4     const static int data;//静态成员变量(类内声明)
     5 public:
     6     //静态成员函数  属于类 而不属于对象
     7     static int getDataStatic(void)
     8     {
     9         //num = 200;//err 静态成员函数 不能访问普通成员变量
    10         return data;
    11     }
    12 };
    13 
    14 //定义的时候 不需要加static
    15 const int Data::data=100;//类外定义+初始化
    16 
    17 void test02()
    18 {
    19     //访问
    20     cout<<Data::data<<endl;
    21     //赋值
    22     //Data::data = 200;//err data静态成员只读
    23     cout<<Data::data<<endl;
    24 }
     
  • 相关阅读:
    61. 最长不含重复字符的子字符串
    60. 礼物的最大价值 (未理解)
    59. 把数字翻译成字符串
    58. 把数组排成最小的数
    57. 数字序列中某一位的数字 (不懂)
    spring data jpa 官方文档
    idea 编译报错 源发行版 1.8 需要目标发行版 1.8
    idea maven 依赖报错 invalid classes root
    solr
    spring boot 官方文档
  • 原文地址:https://www.cnblogs.com/loliconinvincible/p/12527579.html
Copyright © 2011-2022 走看看