zoukankan      html  css  js  c++  java
  • C++静态成员函数不能调用非静态成员变量

    其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为无论是静态成员函数还是静态成员变量,它们

    都是在类的范畴之类的,及在类的整个生存周期里始终只能存在一份。然而非静态成员变量和非静态成员函数是针对类的对象而言。

    然而从本质上来说类的静态成员函数的函数形参中没有默认的this指针,导致不能调用具体实例对象的成员。

    下面我们来测试一下:

    先在静态成员函数中调用静态成员变量:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 class vpoet
     5 {
     6 public:
     7     static int a;
     8     int b;
     9 
    10 public:
    11     vpoet(int data)
    12     {
    13         b=data;
    14     }
    15 
    16     static void statictestfun1()
    17     {
    18         cout<<"static a="<<a<<endl;
    19     }
    20 };
    21 
    22 int vpoet::a=10;
    23 
    24 int main()
    25 {
    26     vpoet *V;
    27     V=new vpoet(5);
    28     vpoet::statictestfun1();
    29     return 0;
    30 }

    调用成功,截图如下:

    现在我们再静态成员函数中调用非静态成员变量:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 class vpoet
     5 {
     6 public:
     7     static int a;
     8     int b;
     9 
    10 public:
    11     vpoet(int data)
    12     {
    13         b=data;
    14     }
    15 
    16     static void statictestfun1()
    17     {
    18         cout<<"static b="<<b<<endl;
    19     }
    20 };
    21 
    22 int vpoet::a=10;
    23 
    24 int main()
    25 {
    26     vpoet *V;
    27     V=new vpoet(5);
    28     vpoet::statictestfun1();
    29     return 0;
    30 }

    编译下提示了错误:

    大意是在静态成员函数中引用了类的非静态成员变量b。

    其实这里可以再深入分析下:

    静态成员变量的函数形参中没有默认的this指针指向类对象本身。所以当我们调用对象的非静态成员变量的时候它不能识别该变量

    然而对于静态成员变量而言,其存在于整个类中,为每个类对象共有,所以就算没有默认的this形参仍然可以识别该静态成员变量

     

  • 相关阅读:
    android项目手势识别GestureDetector
    android项目获取sim卡序列号
    android项目MD5加密
    android项目自定义组合控件添加属性
    android项目自定义组合控件
    C# 斐波那契数列 递归算法_2018Oct
    Unity3D编程学习 小知识_人物移动导航_2018Oct
    As Beginning
    MFC中View显示框架
    混合积判断线段相交
  • 原文地址:https://www.cnblogs.com/vpoet/p/4680828.html
Copyright © 2011-2022 走看看