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开发之旅1:环境搭建及HelloWorld
    程序员学习视频教程汇总
    Maven项目下update maven后Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderL
    查看控制层从前端传来的参数
    PostMethod和GetMethod用法
    @Transient的用法和格式化页面展示的数据格式
    修改hosts
    javascript:history.go(-1)的使用
    JsonConfig的jsonConfig.setExcludes的用法
    验证登录超时,在登录后跳转超时时的页面
  • 原文地址:https://www.cnblogs.com/vpoet/p/4680828.html
Copyright © 2011-2022 走看看