关于C++类中静态函数无法直接访问非静态成员的理解

原创 2016年08月29日 23:02:41
#include<iostream>
using namespace std;
class A
{
    public:
        A():_my(0){}
        static int ad1(){_my++; /*错误*/}
        int ad2(){_my+=2;}
    private:
        int _my;        
}

int main(int argc,char* argv[])
{
    int i,j;
    A* a = new A();
    i = a->ad2();
    j = A::ad1();
    return 0;
}

通过对象调用函数(如a->ad2()),是先通过对象类型和函数名找到函数的位置,再把this指针传给函数,函数里面的成员的位置是通过成员在对象中的偏移加上this指针的值来计算的,所以可以调用到非静态的成员。而我们调用静态方法的方式则有点不同,是直接通过类名来调用(如A::ad1()),有类名的话静态函数的位置的可以确定了,就可以直接B到该位置(B为汇编跳转指令),但不是通过对象调用的话就不会有this指针传入(就算该类已经实例化了对象,每个类都可能存在多个对象,编译器无法确定传入哪一个对象的地址),此时在函数中调用非静态成员的话因为不存在this指针所以一定会出错,所以编译器识别到这个问题的时候就会报错。(你尽管可以通过对象调用静态函数,但这样做的话把那个函数设计成静态函数就没有意义了。)


虽然静态函数无法直接访问非静态成员,但还是可以通过其他的一些手段来访问的,即使是私有的成员,怎么说静态函数也是属于那个类的嘛。访问的方法前辈们都说得很清楚了,我就不再重复。传送门:C++静态成员函数访问非静态成员的几种方法

相关文章推荐

为什么静态方法不能直接访问非静态成员?

static成员是在JVM的CLASSLOADER加载类的时候初始化的,而非static的成员是在创建对象,即new 操作的时候才初始化的;类加载的时候初始化static的成员,此时static 已经...

为什么静态方法不能直接访问非静态成员

static成员是在JVM的CLASSLOADER加载类的时候初始化的,而非static的成员是在创建对象,即new 操作的时候才初始化的;类加载的时候初始化static的成员,此时static 已经...

C++ 类非静态成员函数作为线程入口函数实现

///////////////////////////////////////////////////// //代码 #include #include #include #include ...

C++[类设计]静态窗口过程调用非静态成员函数

//in MainProgram.cpp #include #include "CustomWnd.h" int WINAPI WinMain(HINSTANCE hInstance,HINSTA...

C++非静态成员函数的回调

在C++中有许多方法可以代替掉回调函数,包括虚函数和仿函数等,但需要使用回调的地方还是有很多的。关注到起源于cocos2dx中的回调机制。 因为涉及到类的实例,所以许多需要用的回调的情况都是采用的静态...

C++ 实现把非静态成员函数作为回调函数(非static)

众所周知,C++的类成员函数不能像普通函数那样用于回调,因为每个成员函数都需要有一个对象实例去调用它。         通常情况下,要实现成员函数作为回调函数,一种常用的方法就是把该成员函数设计为静...
  • faihtua
  • faihtua
  • 2012年06月10日 13:02
  • 735

C++ 实现把非静态成员函数作为回调函数(非static)(转 待研究)

C++ 实现把非静态成员函数作为回调函数(非static)(转)   2011-08-05 17:00 345人阅读 评论(0) 收藏 举报         众所周知,C++的类成员函数不能像...

回调函数的C++ 封装(非静态成员函数的回调函数实现方法)

在进行软件开发的过程中,常会用到一些声明为CALLBACK 的函数,这些函数就是回调函数。使用 回调函数可以改善软件的结构、提高软件的复用性。比如,在一个规模较大的软件项目中,可以将一些资 源或相对独...
  • xjkstar
  • xjkstar
  • 2012年06月06日 17:03
  • 1611

类的非静态成员函数指针详解

From:http://blog.csdn.net/hairetz/archive/2009/05/06/4153252.aspx 个人感觉对于类的成员函数指针这块讲解的比较深入详细 推荐阅读 ///...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于C++类中静态函数无法直接访问非静态成员的理解
举报原因:
原因补充:

(最多只允许输入30个字)