类中的static成员函数,存放在堆区吧?
类中的非静态成员函数,也存放在堆区吧?如果是,那么为什么会出现如题的现象呢?

解决方案 »

  1.   

    堆区就存在代码段吧?那么,为什么只有类中的static成员函数,才可以做为线程启动函数(ThreadProc)呢?
      

  2.   

    static 是c++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因、作用谈起,全面分析static 修饰符的实质。 static 的两大作用:一、控制存储方式:  static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间。  1、引出原因:函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 
    最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。  2、 解决方案:因此c++ 中引入了static,用它来修饰变量,它能够指示编译器将此变量在程序的静态存储区分配空间保存,这样即实现了目的,又使得此变量的存取范围不变。二、控制可见性与连接类型 :  static还有一个作用,它会把变量的可见范围限制在编译单元中,使它成为一个内部连接,这时,它的反义词为”extern”.  static作用分析总结:static总是使得变量或对象的存储形式变成静态存储,连接方式变成内部连接,对于局部变量(已经是内部连接了),它仅改变其存储方式;对于全局变量(已经是静态存储了),它仅改变其连接类型。类中的static成员:一、出现原因及作用:  1、需要在一个类的各个对象间交互,即需要一个数据对象为整个类而非某个对象服务。  2、同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。  类的static成员满足了上述的要求,因为它具有如下特征:有独立的存储区,属于整个类。二、注意:  1、对于静态的数据成员,连接器会保证它拥有一个单一的外部定义。静态数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。消除时的顺序是初始化的反顺序。  2、类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致了它仅能访问类的静态数据和静态成员函数。
      

  3.   

    将成员函数声明为静态虽然可以解决作为线程函数的问题,但是它带来了新的问题,那就是static成员函数只能访问static成员。解决此问题的一种途径是可以在调用类静态成员函数(线程函数)时将this指针作为参数传入,并在改线程函数中用强制类型转换将this转换成指向该类的指针,通过该指针访问非静态成员。
      

  4.   

    学习了,但还是想知道:为什么只有类中的static成员函数,才可以做为线程启动函数(ThreadProc),
    而类的非静态成员函数不可以?
      

  5.   

    线程函数是独立于类的实例而存在的,他的生命期不是类的生命期,而是整个process。
    试想一下,如果可以用非静态成员函数作为线程函数,如果没有定义一个这个类的实例,
    岂不是无法调用线程函数了?
      

  6.   

    设某函数原型为 LRESULT ThreadProc(LPVOID pv);若为非静态成员函数,编译时自动展开为 ThreadProc(pClass->this, pv); 与线程函数调用不相符。所以必须使用全局函数或类静态成员函数
      

  7.   

    成员函数都有一个隐含参数this ,也就是指向这个对象实例的指针,所以不能做启动函数
      

  8.   

    设某函数原型为 LRESULT ThreadProc(LPVOID pv);若为非静态成员函数,编译时自动展开为 ThreadProc(pClass->this, pv); 与线程函数调用不相符。所以必须使用全局函数或类静态成员函数---------------------------------------------
    同意作为线程入口当然不应该与类对象共存亡 应该具有全局性
    俺认为所有方法均在于代码段 至于堆中是否存有可执行代码我也想知道
    我一直认为堆只是存放数据的地方