关于C++静态成员函数访问非静态成员变量的问题

静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存。静态成员函数没有隐含的this自变量。所以,它就无法访问自己类的非静态成员

代码如下:

class a
{
public:
  static
FunctionA()
  {
     menber = 1;
  }

private:
  int
menber;
}

编译上述代码,出错。原因很简单大家都知道,静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的
member可能都没有分配内存。静态成员函数没有隐含的this自变量。所以,它就无法访问自己类的非静态成员。

那要想访问怎么办呢?地球人都知道只要将:

复制代码
代码如下:

int menber;
//change the line above
to:
static int menber;

但是这个方法让我们不得不将static
function内用到的成员变量都变成static的了,而且static的成员还要显式初始化,有没有更好的方法?答案是肯定的。代码说话:

复制代码
代码如下:

class a
{
public:
  static
FunctionA(a* _a)
  {
    _a-> menber = 1;
 cout<<_a->
menber<<endl;
 _a->f();
  }
void
f()
{
 cout<<"f被调用了"<<endl;
}
private:
  int
menber;
};

前提是这个类要分配了内存空间。其实这里我做的就是将一个对象指针作为静态成员函数的“this”指针,意在模仿传递非静态成员函数里this变量(在非静态成员函数中都有this指针(push在ECX中似乎))

这个想法是我在一个class中要CreateThread的时候产生的,因为Thread
的funtion都是要求static的(是这样的把?不知道为什么我写的code,Thread都是static的了。忘了哪儿看到的有这个要求了。有时间找找原因)。

可见C++是非常灵活的。

时间: 2024-12-11 17:53:38

关于C++静态成员函数访问非静态成员变量的问题的相关文章

C++静态成员函数访问非静态成员的几种方法

大家都知道C++中类的成员函数默认都提供了this指针,在非静态成员函数中当你调用函数的时候,编译器都会“自动”帮你把这个this指针加到函数形参里去.当然在C++灵活性下面,类还具备了静态成员和静态函数,即 class A { public: static void test() { m_staticA += 1; } private: static int m_staticA; int m_a }; 此时你的test函数只能去访问m_staticA成员,而不能去访问m_a.同学可能会问,这算

为什么c++中,有时可以用类名直接访问非静态成员函数?

正规的C++语言标准目前(截止到C++14)应该还不支持这种调用方法.目前微软似乎在它的VC++中推行一种叫做C++/CLI的标准,有可能会支持这种调用,如果一定要用这种调用方法的话,还应该用VS2013尝试编译运行一下. 实际上,C++语言中类的静态成员函数本身应该是所有这一类对象的集体所具有的行为,就是说,不是某一个对象能够具有或者说实现的:而非静态成员函数应该是某一个对象自己的动作行为,跟本类其他对象乃至整个类关系不大,是对象依靠自己的数据以及函数参数就可以完成的行为.根据以上的讨论,我们

为什么在静态方法中 不能访问非静态成员

程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问.类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问:非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问.在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错:class CA{private:int a; //非静态成员,创建类

静态成员函数为什么不能访问本类中的非静态成员?

和静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分.如果要在类外调用公用的静态成员函数,要用类名和域运算符"∷".如Box∷volume( );实际上也允许通过对象名调用静态成员函数,如a.volume( );但这并不意味着此函数是属于对象a的,而只是用a的类型而已.静态成员函数的作用是为了能处理静态数据成员.可以说,静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,静态成员函数并不属于某一对象,它与任何对象都无关,静态成员函数没有this指针.由此

C++学习10 static静态成员变量和静态成员函数

一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干.但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享. 可以使用全局变量来达到共享数据的目的.例如在一个程序文件中有多个函数,每一个函数都可以改变全局变量的值,全局变量的值为各函数共享.但是用全局变量的安全性得不到保证,由于在各处都可以自由地修改全局变量的值,很有可能偶然失误,全局变量的值就被修改,导致程序的失败.因此在实际开发中很少使用全局变量. 如果想在同类的多

static作用,静态成员变量和静态成员函数

static关键字有俩作用:(1).控制存储分配:(2).控制一个名字的可见性和连接. 随着C++名字空间的引入,我们有了更好的,更灵活的方法来控制一个大项目的名字增长. 在类的内部使用static是在全程序中控制名字的另一种方法.这些名字不会与全局名冲突,并且可见性和访问也限制在程序内部,使得在维护代码时有更多的控制. 数据成员可以分静态变量.非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静

析构函数 this 静态成员变量 静态成员函数

1. 析构函数 1.    析构函数没有参数,不能被重载,因此一个类只能有一个析构函数.如果用户没有定义,那么编译器会自动生成. 2.  static 局部对象在函数调用结束时并不销毁,因此也不调用析构函数, 只有在程序结束时(如 main 函数结束或调用 exit 函数)才调用 static 局部对象的析构函数. 3) 如果定义了一个全局对象,也只有在程序结束时才会调用该全局对象的析构函数. #include <iostream> #include <cstdlib> using

C++ static 静态变量&amp;静态成员函数

静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的.你在一个对象里给它赋值,其他对象里的该成员也会发生变化.为了避免混乱,所以不可在类体内进行赋值. 静态成员的值对所有的对象是一样的.静态成员可以被初始化,但只能在类体外进行初始化. 一般形式: 数据类型类名::静态数据成员名=初值 注意:不能用参数初始化表对静态成员初始化.一般系统缺省初始为0. 关于静态成员函数,可以总结为以下几点:出现在类体外的函数定义不能指定关键字static:静态成员之间可以相互访问,包括静态成员函数访问静态

类的静态成员函数和静态成员变量的使用

当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享.各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关.静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关. 静态数据成员的用途之一是统计有多少个对象实际存在. 静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的.也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一