关于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++静态成员函数访问非静态成员的几种方法

C++ 静态成员函数调用非静态成员函数方法

#include #include class Class; typedef struct { Class *pClass; int x; int y; }ParaNode; clas...
  • vanquishedzxl
  • vanquishedzxl
  • 2015年06月14日 17:44
  • 2316

静态成员函数不可以访问类中的成员变量

原因:因为静态成员函数在类对象构造时没有分配this指针(非静态成员函数则具有this指针),相当于是全局函数,是属于类的,而类的成员变量只有类对象(实例)能够访问,成员变量只有实例化才有意义。 解...
  • Kelvin_Yan
  • Kelvin_Yan
  • 2016年11月15日 15:51
  • 1896

回调函数中如何调用类中的非静态成员变量或非静态成员函数

回调函数中调用类中的非静态成员变量或非静态成员函数 【问题1】如何在类中封装回调函数? 【答】:   a.回调函数只能是全局的或是静态的。   b.全局函数会破坏类的封装性,故不予采用。 ...
  • bzhxuexi
  • bzhxuexi
  • 2014年02月24日 17:09
  • 4271

静态成员函数和非静态成员函数的区别?

静态成员函数和非静态成员函数的区别? 一个静态成员函数不与任何对象相联系,故不能对非静态成员进行默认访问。 它们的根本区别在于静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的...
  • lejun2011
  • lejun2011
  • 2013年09月18日 10:10
  • 6987

java学习总结(16.06.07)类的静态成员和非静态成员

java里,类的成员可分为静态成员和费静态成员(实例成员),静态成员和非静态成员,从定义上来说就是有没有static修饰符修饰的区别。有static修饰的成员就是静态成员。如 public stati...
  • qq_32099621
  • qq_32099621
  • 2016年06月07日 07:08
  • 745

再探私有/公有静态成员变量与私有静态成员方法

问题1: 为什么在类内的静态成员定义后,要到类的外部在定义和初始化? 问题2:为什么类的静态成员在类外部的定义只能一次? 问题3:私有的静态成员变量如何初始化,访问权限还是私有么? 问题4:在程序执行...
  • tianjian789
  • tianjian789
  • 2015年09月06日 12:20
  • 1981

c++类中静态函数不能调用类中的非静态函数原因

程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问。  类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问; 非静态成员(变量和方法)属于类的对象...
  • shejiannan
  • shejiannan
  • 2015年10月09日 13:53
  • 1099

C++静态成员变量和静态成员函数使用总结

C++静态成员变量和静态成员函数使用总结: 一.静态成员变量:          类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员...
  • fanyun_01
  • fanyun_01
  • 2016年05月16日 09:11
  • 7432

C++函数调用之静态成员函数

首先,定义如下类A: class A { private: static int val_s; public: static int getVal(){cout ...
  • C12345SDN
  • C12345SDN
  • 2014年09月06日 11:27
  • 2701

静态成员函数和普通成员函数的区别

成员函数:无论静态函数还是非静态函数,都是属于类的(这一点与数据成员的静态非静态不同),对象并不拥有函数的拷贝.两者的区别在于:非静态的函数由类对象(加.或指针加->;)调用,这时将向函数传递this...
  • liujianfei526
  • liujianfei526
  • 2016年01月22日 16:32
  • 2929
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于C++类中静态函数无法直接访问非静态成员的理解
举报原因:
原因补充:

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