这样有特定的地址空间,这样可以避免在运行时system对内存调整带来的问题

解决方案 »

  1.   

    使用静态成员变量的确可以“节省内存”,但静态成员函数并不会——无论是不是静态成员函数,编译器都不会在类的每个实例中为此函数保存一个副本——函数永远是在代码段中,而对象(类的实例)是放在数据段中。
    静态函数与非静态函数实质的区别是this指针的问题。
    例如定义这样一个类:
    class CAAA 
    {
       public:
         ..... 
         static void StaticFunc(int);
         void NonstaticFunc(int);
    } a;
    如果我们调用非静态函数:     a.NonstaticFunc(1);
    这就相当于调用这样一个c函数: NonstaticFunc(&a, 1);
    于是在函数中使用this或存取成员变量时,就使用&a指针实现。
    但如果我们调用静态函数:    a.StaticFunc(1);
    实际相当于调用这样一个c函数: StaticFunc(1);
    因此静态函数中没有所谓的this指针。
      

  2.   

    所以,静态函数往往这样来调用:CAAA::StaticFunc(1);
    而非静态函数绝对不行。
      

  3.   

    也就是说,静态函数可以在没有类的实例(就是未用类定义任何对象)的情况下被调用,而非静态函数不行。事实上,即使定义了类的实例,并用该对象调用静态函数(例如上面的a.StaticFunc(1);),依然不可能在静态函数中存取到类的非静态成员变量,因为没有this指针!(其实对静态函数来说,a.StaticFunc(1)与CAAA::StaticFunc(1)二者是没有区别的)
      

  4.   

    因为静态函数不依赖于类而存在,也就是如上面的同仁所说,不带this指针。
      

  5.   

    线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放
    也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程堆栈中static只是起了一个装饰的作用,所以二者并没有必然的关系
      

  6.   

    <<因为静态函数不依赖于类而存在,这么做有什么好处吗?有什么必要吗?
      

  7.   

    <<由于调用静态函数不需要具体的某个对象,所以是很方便的。只是为了方便,不是必须这么做,对不对?
    只要愿意,就可以不把它做成全局函数或静态成员函数,而把真正作为对象的一部分,是吗?
      

  8.   

    线程也是一种资源,是受系统调度的。因此,你必须要让系统知道你的线程的起始位置,即线程函数的指针。
    Window系统的接口(API)是C标准的,系统在启动线程时,需要直接得到线程的起始位置,因此你也必须向系统直接传递这样一个直接的函数指针,这与C++其它的特性是无关的。
    喜欢的话,你也可以直接使用汇编语言来写一个创建线程的过程,这时候,是可以用非静态的类的成员函数的。
      

  9.   

    to temp,用static成员函数,可以把监听线程也封装在类里面,无论是使用上,还是在代码的重用上都是方便的,而普通的类成员函数是不能作为监听线程函数的(因为其隐含了this参数,与创建线程时参数要求不一致).当然你也可以把线程作为全局函数了,但一定不能是普通的类成员函数
      

  10.   

    to temp你有没有做好的串口通信程序(是经过测试的),如果可以,给我一份,我最近在做,除了问题,但不知道是什么原因
      

  11.   

    呵呵,temp(全局变量)老兄这问题贴了很久了嘛,老兄追求真理的精神可嘉,不过颇有些钻牛角尖的味道,呵呵……
    对操作系统真正的实现而言,启动一个线程需且只需一个入口地址就可以了。但是你要注意的是,我们提供的所谓控制函数,并不是这个真正的入口点。操作系统启动线程时,总是先调用一些特定的入口代码,这部分代码对线程的运行环境做一定的初始化之后,再调用你的控制函数。由于这些入口代码是在内核中写好了的,所以它所调用得控制函数其原型也是固定的,就是在CreateThread API中声明的那样。因此,在一个封装线程的类里面,实际上控制函数是不是静态的无关紧要,关键的是该类在最终启动线程时,传递给CreateThread函数的控制函数必须符合上述的原型。至于VC的类为什么用静态的控制函数,我想只是为了方便,但这并不说明就不能用非静态函数实现。例如C++Builder中的线程类就没有用到静态控制函数。
      

  12.   

    admireO(初学者) :俺的程序不足之处很多,答辩后就给你发一份怎么样?(做反面教材)