C++静态成员函数不能调用非静态成员变量(详解)

 更新时间:2016年12月22日 10:08:32   投稿:jingxian  
下面小编就为大家带来一篇C++静态成员函数不能调用非静态成员变量(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

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

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

下面我们来测试一下:

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

#include <iostream>
using namespace std;

class vpoet
{
public:
  static int a;
  int b;

public:
  vpoet(int data)
  {
    b=data;
  }

  static void statictestfun1()
  {
    cout<<"static a="<<a<<endl;
  }
};

int vpoet::a=10;

int main()
{
  vpoet *V;
  V=new vpoet(5);
  vpoet::statictestfun1();
  return 0;
}

调用成功,截图如下

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

#include <iostream>
using namespace std;

class vpoet
{
public:
  static int a;
  int b;

public:
  vpoet(int data)
  {
    b=data;
  }

  static void statictestfun1()
  {
    cout<<"static b="<<b<<endl;
  }
};

int vpoet::a=10;

int main()
{
  vpoet *V;
  V=new vpoet(5);
  vpoet::statictestfun1();
  return 0;
}

编译下提示了错误:

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

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

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

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

以上就是小编为大家带来的C++静态成员函数不能调用非静态成员变量(详解)全部内容了,希望大家多多支持脚本之家~

相关文章

  • C/C++中CONST用法总结(推荐)

    C/C++中CONST用法总结(推荐)

    这篇文章主要介绍了C/C++中CONST用法总结(推荐),包括const常量与define宏定义的区别介绍,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-07-07
  • C/C++ Qt 自定义Dialog对话框组件应用案例详解

    C/C++ Qt 自定义Dialog对话框组件应用案例详解

    有时候我们需要一次性修改多个数据,使用默认的模态对话框似乎不太够用,此时我们需要自己创建一个自定义对话框。这篇文章主要介绍了Qt自定义Dialog对话框组件的应用,感兴趣的同学可以学习一下
    2021-11-11
  • C语言链表实现销售管理系统

    C语言链表实现销售管理系统

    这篇文章主要为大家详细介绍了C语言链表实现销售管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C++中简单的文本文件输入/输出示例详解

    C++中简单的文本文件输入/输出示例详解

    C++程序把输入和输出看作字节流,输入时程序从输入流中抽取字节,输出时程序将字节插入到输出流中,下面这篇文章主要给大家介绍了关于C++中简单的文本文件输入/输出的相关资料,需要的朋友可以参考下
    2021-12-12
  • opencv实现图像颜色空间转换

    opencv实现图像颜色空间转换

    这篇文章主要为大家详细介绍了opencv实现图像颜色空间转换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • C++基于栈的深搜算法实现马踏棋盘

    C++基于栈的深搜算法实现马踏棋盘

    这篇文章主要为大家详细介绍了C++基于栈的深搜算法实现马踏棋盘,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C/C++语言八大排序算法之桶排序全过程示例详解

    C/C++语言八大排序算法之桶排序全过程示例详解

    这篇文章主要为大家介绍了C/C++语言八大排序算法之桶排序算法过程的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • 基于欧几里德算法的使用

    基于欧几里德算法的使用

    本篇文章介绍了,基于欧几里德算法的使用。需要的朋友参考下
    2013-05-05
  • C++产生随机数的几种方法小结

    C++产生随机数的几种方法小结

    本文主要介绍了C++产生随机数的几种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • c++超细致讲解引用

    c++超细致讲解引用

    在我们日常的生活中每个人都或多或少存在一个"外号",例如《西游记》中孙悟空就有诸多外号:美猴王,孙行者,齐天大圣等等。那么在C++中,也可以给一个已经存在的变量取别名,这就是引用。那么接下来深入来探讨一下引用
    2022-05-05

最新评论