精华内容
下载资源
问答
  • 静态成员函数与非静态成员函数的区别 数据成员: 静态数据成员是类的一部分,为类的所有实例共享(静态区);非静态数据成员,类的每个实例都有一份拷贝(动态区)。 静态数据成员的访问: 静态数据成员是类的一部分,在...
  • 为什么C++静态成员函数不能访问非静态成员变量、不能调用非静态成员函数?(面试常考).pdf
  • 本文主要介绍C++回调函数中调用类中的非静态成员变量或非静态成员函数 回调函数中调用类中的非静态成员变量或非静态成员函数 【问题】如何在类中封装回调函数? a.回调函数只能是全局的或是静态的。 b.全局函数会...

    本文主要介绍C++回调函数中调用类中的非静态成员变量或非静态成员函数

    回调函数中调用类中的非静态成员变量或非静态成员函数
    【问题】如何在类中封装回调函数?
      a.回调函数只能是全局的或是静态的。
     b.全局函数会破坏类的封装性,故不予采用。
     c.静态函数只能访问类的静态成员,不能访问类中非静态成员。
     
     1. 如何让静态函数访问类的非静态成员。
         a.声明一静态函数a(),将类实例对象指针做为参数传入。如:
      

      class A()
      {
          static void a(A *); //静态函数
          void b();  //非静态函数
      } 
      void A::a(A * pThis)
      {
       pThis->b(); //静态函数中调用非静态函数
      }


         b.回调函数中访问非静态成员
      由于回调函数往往有固定定义,并不接受  A * pThis 参数
      如:CALLBACK MyTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);
     
    【解决方案1】:本方案当遇到有多个类实例对象时会有问题。原因是pThis指针只能指向一个对象。
     

     class A
    {
        A();
        static void a();//静态函数
        void b();//非静态函数
        static A* pThis;//静态对象指针
    };
    A* A::pThis=NULL;
    A::A()//构造函数中将this指针赋给pThis,使得回调函数能通过pThis指针访问对象
    {
        pThis = this;
    }
    void A::a()//
    {
        if(pThis==NULL)
            return ;
        pThis->b();//回调函数中调用非静态成员函数
    }
    void A::b()
    {
    }


      【解决方案2】:本方案解决多个类实例对象时方案1的问题。用映射表存所有对象地址,每个对象保存自己的ID号。
     

     typedef CMap<UINT,UINT,A*,A*> CAMap;
      class A()
      {
          static void a(); //静态回调函数
          void b();  //非静态函数
          int m_ID;  //本对象在列表中的ID号
          static int m_SID;   //静态当前对象ID        (需要时,将m_ID赋值给m_SID以起到调用本对象函数的功能)
          static CAMap m_Map; //静态对象映射表
      } 
     
      CAMap A::m_Map;
      int   A::m_SID=0;
     
     
      A::A()   //构造函数中将this指针赋给pThis,使得回调函数能通过pThis指针访问本对象
      {
          if(m_Map.IsEmpty())
          {
       m_ID=1;
          }
          else
          {
            m_ID=m_Map.GetCount()+1;
          }
          m_Map.SetAt( m_ID, this );
      }
      void A::a()
      {
          if (m_Map.IsEmpty()) return;
          A * pThis=NULL;
          if(m_Map.Lookup(m_SID,pThis))
          {
       pThis->b(); //回调函数中调用非静态函数
          };
      }


    //注释:初始化和赋值有什么区别
    初始化与赋值是不同的概念:静态变量的初始化是在编译时进行,变量的赋值是在函数或程序运行时进行。
    静态变量只初始化一次,但可以通过赋值的方式多次修改静态变量的值。
    全局变量和静态变量 在进入 main 前被初始化
    静态成员变量在哪都可以赋值    

    展开全文
  • 非静态成员函数暗含this指针,调用非静态成员函数,需要this指针,如执行非静态成员函数merge(),实际是this->merge(),而静态成员函数不含this,因此无法调用 调用构造函数,不需要this,因此静态成员函数可以...

    静态成员函数 不含 this指针

    非静态成员函数暗含this指针,调用非静态成员函数,需要this指针,如执行非静态成员函数merge(),实际是this->merge(),而静态成员函数不含this,因此无法调用


    调用构造函数,不需要this,因此静态成员函数可以调用构造函数。

    展开全文
  • 和静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分。如果要在类外调用公用的静态成员函数,要用类名和域运算符“∷”。如 ...可以说,静态成员函数与非静态成员函数的根本区别是:
    和静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分如果要在类外调用公用的静态成员函数,要用类名和域运算符“∷”。如
    Box∷volume( );
    实际上也允许通过对象名调用静态成员函数,如
    a.volume( );
    但这并不意味着此函数是属于对象a的,而只是用a的类型而已
    静态成员函数的作用是为了能处理静态数据成员
    可以说,静态成员函数与非静态成员函数的根本区别是: 非静态成员函数有this指针,静态成员函数并不属于某一对象,它与任何对象都无关,静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。
    在C++程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。假如在一个静态成员函数中有以下语句:
    cout<<height<<endl;             //若height已声明为static,则引用本类中的静态成员,合法
    cout<<width<<endl;              //若width是非静态数据成员,不合法


    那有需要访问怎么办?一是实例化一个类,比如staticfunc(a.getval)来调用,或者用指针,传入自己的对象指针。

    class A
    {
    public:
      static void func(A & obj);
      int getval() const; //non-static member function
    private:
     int val;
    };

    静态成员函数func()会使用参照obj来访问非静态成员val。

    voidA::func(A & obj)
    {
      int n = obj.getval();
    }


    静态数据成员和普通数据成员区别较大,体现在下面几点: 
      (1)普通数据成员属于类的一个具体的对象,只有对象被创建了,普通数据成员才会被分配内存。而静态数据成员属于整个类,即使没有任何对象创建,类的静态数据成员变量也存在。 

      (2)因为类的静态数据成员的存在不依赖与于任何类对象的存在,类的静态数据成员应该在代码中被显示的初始化,一定要在类外进行,例如上例。 

      (3)外部访问类的静态成员只能通过类名来访问,例如:test::getCount()。 
      (4)类的静态成员函数无法直接访问普通数据成员(可以通过类的指针等作为参数间接访问),而类的任何成员函数都可以访问类的静态数据成员。 

      (5)静态成员和类的普通成员一样,也具有public、protected、private3种访问级别,也可以具有返回值、const修饰符等参数。

    展开全文
  • 在多人开发的项目中,一些通用的工具类接口可以用静态成员函数。方便调用,并且不容易调用错误。静态成员函数不传递this指针(不能-&...静态成员函数如果必须访问非静态成员变量,必须通过对象来引用。...
    1. 在多人开发的项目中,一些通用的工具类接口可以用静态成员函数。方便调用,并且不容易调用错误。
    2. 静态成员函数不传递this指针(不能->),不识别对象个体,所以经常用于对静态数据成员进行操作。不能操作非静态成员变量。
    3. 静态成员函数如果必须访问非静态成员变量,必须通过对象来引用。
    #ifndef MYSTAIC_H
    #define MYSTAIC_H
    
    #include <QObject>
    #include <QDebug>
    #include <QString>
    #include <QMutex>
    
    class MyStaic : public QObject
    {
        Q_OBJECT
    public:
        explicit MyStaic(QObject *parent = 0);
        ~MyStaic();
        static  void  test();
        static  void  test(MyStaic &myStaic);
        static QMutex*  mutex;
        void  notStaticfun();
    private:
        int  tmp ;
    
    };
    
    #endif // MYSTAIC_H
    
    • MyStaic 作为static测试类,test作为普通的静态函数。
    • 带参数的test函数作为访问非静态成员变量的静态函数
    • mutex为静态成员变量,用于静态成员函数中调用
    • notStaticfun() 函数为普通成员函数,用于静态成员函数调用
    #include "mystaic.h"
    QMutex*  MyStaic::mutex = new QMutex;
    
    MyStaic::MyStaic(QObject *parent) : QObject(parent)
    {
        qDebug() << "This is  构造函数";
        tmp = 10;
    }
    
    
    MyStaic::~MyStaic()
    {
        qDebug() << "this is 析构";
    }
    
    void MyStaic::test()
    {
        qDebug() <<  "OK";
        mutex->lock();
        mutex->unlock();
    
    
    }
    
    void MyStaic::test(MyStaic &myStaic)
    {
        qDebug() << "This is not static Member variables tmp =" << myStaic.tmp ;
        myStaic.notStaticfun();
    }
    
    void MyStaic::notStaticfun()
    {
        qDebug() <<  "This  is  not  static  fun";
    }
    

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private:
        Ui::MainWindow *ui;
    };
    
    #endif // MAINWINDOW_H
    

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "mystaic.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        MyStaic::test();
        MyStaic*  myNoStatic = new MyStaic(this);
        MyStaic::test(*myNoStatic);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    

    #include "mainwindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        return a.exec();
    }
    


    本程序的运行结果为:

    OK

    This is 构造函数

    This is not static Member variables tmp = 10

    This is not static fun

    this is 析构




    展开全文
  • 静态成员函数和非静态成员函数的区别? 一个静态成员函数不与任何对象相联系,故不能对非静态成员进行默认访问。 它们的根本区别在于静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的指针this。...
  • Q1:成员函数分为三种:静态成员函数,非静态成员函数,虚拟成员函数。本节的讨论均使用以下的类例子:Eg: class Point3d { public: Point3d(int i = 0, int j = 0, int k = 0) :_x(i), _y(j), _z(k){} Point3d ...
  • 介绍C++中静态成员函数与费静态成员函数的区别。
  • C++并不会将每个非静态成员函数的代码放在每个类对象中,而是根据类名维护所有的成员函数,当通过某个类对象调用成员函数时会如同调用普通函数一样进行调用,只不过在函数参数列表中添加了一个额外的参数:this指针...
  • 回调函数中调用类中的非静态成员变量或非静态成员函数 【问题1】如何在类中封装回调函数? 【答】:  a.回调函数只能是全局的或是静态的。  b.全局函数会破坏类的封装性,故不予采用。  c.静态函数只能访问...
  • 它们的根本区别在于静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的指针this。 例如: 1 class Sc 2 { 3 public: 4 void nsfn(int a); //像声明Sc::nsfn(Sc *this , int a); 5 static...
  • 数据成员: 静态数据成员是类的一...静态函数成员非静态函数成员都为类所有,对象中并不存在函数的拷贝(每个对象所占用的存储空间只是该对象的数据成员所占用的存储空间,但是在逻辑上函数和数据是一起被封装进...
  • Qt使用中,有次使用非静态成员函数作为线程函数 即: trhead_creat(&id,,NULL,线程函数,NULL); 出现了问题,说invalid use of non-static nember function 查询了资料发现,类的非静态成员函数都有一个隐含的...
  • 静态成员函数成员函数的区别 从知乎上看到一个问题,看得我怀疑人生,咬牙切齿,如下图: 对于面试官的解释,把我整蒙圈了;于是自己写代码验证如下: #include<iostream> using namespace std; class A...
  • 非静态成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,static就行,我就不行,歧视我???本例就是自己的研究成果,使用非静态成员函数作为线程函数,还能修改类的非静态的...
  • 通过函数指针调用C++非静态成员函数通过函数指针调用C++非静态成员函数
  • C++中,静态成员函数不能被声明为virtual函数。  例如,下面的程序会编译失败。 #include&lt;iostream&gt; class Test { public: // 编译错误:static成员函数不能声明为virtual virtual static ...
  • 回调函数中调用类中的非静态成员变量或非静态成员函数 【问题】如何在类中封装回调函数? a.回调函数只能是全局的或是静态的; b.全局函数会破坏类的封装性,故不予采用; c.静态函数只能访问类的静态成员,不...
  • 回调函数中调用类中的非静态成员变量或非静态成员函数 【问题】如何在类中封装回调函数? a.回调函数只能是全局的或是静态的; b.全局函数会破坏类的封装性,故不予采用; c.静态函数只能访问类的静态成员,...
  • 非静态成员函数与this指针

    千次阅读 2016-11-15 15:45:17
    this指针只能在非静态成员函数中使用,全局函数、静态函数都不能使用this指针。实际上,非静态成员函数默认的第一个参数为T* const this 例如,调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一...
  • C++中,静态成员函数不能被声明为virtual函数。 例如,下面的程序会编译失败。#include<iostream> class Test { public: // 编译错误:static成员函数不能声明为virtual virtual static void fun() { } };...
  • 首先要明白:静态成员函数是可以调用非静态数据成员的,具体怎么调用,看下面。 class A { public: static void fun ( A a ) { cout << b <<endl;(错误) cout <&l...
  • int (Point::*funcptr)()... // 定义一个指向函数的指针,指向类的静态成员函数 在书上的例子中,有以上两条语句。可以发现,指向成员函数的指针,当指向普通成员函数时,需要使用&;指向静态成员函数时,不需...
  • 静态数据成员可以被非静态成员函数访问。但静态成员函数只能访问静态数据成员。静态数据成员从属于某一个类,而不是某一个类的 对象。同理,静态成员函数也是一样。 追问 定义静态成员函数的作用有何在呢 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 212,081
精华内容 84,832
关键字:

非静态成员函数