精华内容
下载资源
问答
  • 2019-02-27 17:01:40

    在Java中同类中的静态方法不可以调用类成员变量以及静态方法。
    因为因为java中静态的东西是类级别的,也就是说用类名就可访问,也可以用任何对象名访问。

    更多相关内容
  • C++,C 包含两个互相调用彼此的类成员变量和方法,里面介绍了如何在头文件中创建相互的对象,简单易懂
  • 本文主要介绍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 前被初始化
    静态成员变量在哪都可以赋值    

    展开全文
  • c++类成员变量初始化详解

    千次阅读 2022-04-15 10:08:24
    注意调用资深构造函数之前,首先会调用成员变量构造函数并进行初始化,再进入自身构造函数进行初始化。成员变量的声明顺序,就是初始化顺序。后面我们提到的很多情况就跟这个有关系,后面再进行详细解读。 2....

    1.类初始化顺序

    当类初始化的时候,会调用其构造函数并进行初始化。当对象结束其生命周期,会调用析构函数进行资源回收。

    注意类在调用资深构造函数之前,首先会调用其成员变量构造函数并进行初始化,再进入自身构造函数进行初始化。成员变量的声明顺序,就是初始化顺序。后面我们提到的很多情况就跟这个有关系,后面再进行详细解读。

    2.声明时初始化

    第一种方式是在成员变量声明时初始化。可以看如下示例。

    class D {
        int a = 10;
    };
    

    在声明变量a的时候即给其初始化为10。不过注意这种写法是c++11以后才有的。上述代码在IDE中会有如下警告信息:

    in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions]
    

    3.构造函数初始化列表

    第二种方式是在构造函数中加入一个初始化列表,对成员变量进行初始化。

    class D {
        int a, b;
        string c;
        public:
            D() : a(1), b(2), c("sss") {
                cout<<"a is: "<<a<<endl;
                cout<<"b is: "<<b<<endl;
                cout<<"c is: "<<c<<endl;
            }
    };
    

    如果我们对D进行实例化,

    int main(int argc, char const *argv[])
    {
        D d;
        return 0;
    }
    

    代码会有如下输出

    a is: 1
    b is: 2
    c is: sss
    

    4.构造函数内部赋值

    在其他语言中,比如java,最常用的方式为在构造函数内部赋值。

    class D {
        int a, b;
        string c;
        public:
            D(int a, int b, string c) {
                this->a = a;
                this->b = b;
                this->c = c;
                cout<<"a is: "<<a<<endl;
                cout<<"b is: "<<b<<endl;
                cout<<"c is: "<<c<<endl;
            }
    };
    
    int main(int argc, char const *argv[])
    {
        D d(1, 2, "sss");
        return 0;
    }
    

    上面代码输出为

    a is: 1
    b is: 2
    c is: sss
    

    5.只能构造函数初始化列表的情况

    如果一个类成员,他本身是一个类或者结构,而且这个类成员没有默认的无参构造函数,只有带参数的构造函数,这个时候对类成员初始化时,必须调用类成员带参数的构造函数。如果再初始化列表中没有完成类成员初始化,代码会报错。

    };
    
    class F {
        E e;
        public:
            F() {cout<<"init F class!"<<endl;}
    };
    
    int main(int argc, char const *argv[])
    {
        F f;
        return 0;
    }
    

    上述代码是可以正常运行的,因为类E有默认无参构造函数。

    而如果将代码改为下面的样子,给E加一个带参数的构造函数

    class E {
        int num;
        public:
            E(int n) {
                this->num = n;
            }
    };
    
    class F {
        E e;
        public:
            F() {cout<<"init F class!"<<endl;}
    };
    
    int main(int argc, char const *argv[])
    {
        F f;
        return 0;
    }
    

    上面代码在IDE里直接会报错:

    constructor for 'F' must explicitly initialize the member 'e' which does not have a default constructor
    

    此时需要将F的构造函数改成如下形式:

    class F {
        E e;
        public:
            F() : e(10) {cout<<"init F class!"<<endl;}
    };
    

    另外,如果类的成员变量中有const时候,也需要在成员初始化列表中赋值完成初始化。

    class F {
        private:
            const int num;
        public:
            F(): num(10) {}
    };
    

    比如上面类F中有一个const常量num,就需要再F构造函数列表中对其进行赋值,否则代码会报错。

    6.列表初始化与构造函数初始化区别

    当采用列表初始化的时候,代码直接调用了成员变量的构造函数,只需要一步就可以完成。
    而在构造函数中初始化的时候,先调用的是成员变量的默认构造函数构造了类成员,然后再调用赋值运算符对之前默认构造的类成员进行赋值,这实际上进行了两步操作。
    当类的结构较为复杂的时候,会存在性能上的差异。

    展开全文
  • 成员方法中调用成员变量语法格式 : …self .变量名 例: 成员方法中调用成员方法格式 : …self . 方法名(实参1 , 实参2, …) 例 : self : 仅出现在成员方法中 , 指代执行该方法的对象 ...

    成员方法中调用成员变量语法格式 :
    …self .变量名
    例:
    在这里插入图片描述

    成员方法中调用成员方法格式 :
    …self . 方法名(实参1 , 实参2, …)
    例 :
    在这里插入图片描述

    self : 仅出现在成员方法中 , 指代执行该方法的对象

    展开全文
  • 静态方法可以调用成员变量吗?

    千次阅读 2017-07-22 09:46:15
    static是级别方法 也就是可以 类名.方法调用 不加static是实例级别的 也就是必须 先有实例(对象) ...而一般我们所说的成员变量,是指对象级别的,也就是说每一个对象所拥有的成员变量都是独立的不同的变量,是属
  • Java一个类调用另一个成员变量

    千次阅读 2020-05-21 09:24:30
    在本中实例化想调用,就可以调用他的成员变量了 public class demo{ String str; int i; public demo(){ str="abc"; } } public class demo1{//在demo1的构造方法中调用demo中的字符串 public demo1(){ ...
  • Java中的静态方法调用静态成员变量

    千次阅读 2015-11-04 09:00:16
    1. 静态方法只能直接调用静态成员(包括变量和方法),而不能直接访问中的非静态成员 2. 静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所...
  • 调用 另一个中的1, 方法(方法区别于成员方法的标志就是有无static)homework05.Test52.randomNumber(100,20,8); //直接调用即可, 包名.类名.方法名();同一个包中可不写包名.1 packagehomework06;23 importhomework...
  • Python中的变量和成员变量

    千次阅读 2021-10-11 10:26:29
    代码演示: class Test(object): a = 100 # a是变量,... self.b = 200 # b是成员变量,可以由的对象来调用 def fcn(self): c = 300 # c不是成员变量,只是函数fcn内部的局部变量 self.d = 400 # d也不是成员变量
  • 实例变量(成员变量) 在的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在声明的内部但是在的其他成员方法之外声明的。 当一个对象被实例化之后,每个实例变量的值就跟着确定; 实例变量在对象...
  • 成员变量;对象名.成员方法();成员变量的默认值:(免费学习视频教程分享:java视频教程)具体实例代码:public class StudentTest_01 {public static void main(String[] args) {//创建对象格式,类名 对象名 = new ...
  • C++ 两个包含互相调用彼此的类成员变量和方法
  • public class Teacher extends Employee { public static void main(String[] args) { } public void method() { super.method();...父类的方法 method() 是成员方法,虽然子类重新覆盖了,但是子类也继承
  • JAVA内部成员内部

    千次阅读 2021-03-09 06:39:17
    既然叫成员内部,说明和成员变量是有类似的地方。从代码的层次结构上来看他是和成员变量处于相同层级的。我们来举个例子。上图代码中,在OutClass中定义了一个成员变量name。在OutClass中又定义了一个InClass...
  • 我的目录结构如下:  因为我在使用的是OpenCV ,所以...你直接删了就行,不然你直接把我代码复制过去会报错的,我这里只是告诉大家怎么调用其他的函数 1. stdafx_h 常用的库文件 // // stdafx.h // Firs...
  • C++中访问类成员变量的几种方式

    千次阅读 2020-05-21 10:22:25
    //第一种,c++提供的类成员指针 int test::*p = &test::a; double test::*q = &test::b; string test::*m = &test::c; t.*p = 5; t.*q = 2.2; t.*m = "hello"; cout ;//5 cout ;//2.2 cout () ;//hello //第二种 t....
  • 多线程调用类成员变量或者说的内部调用多线程的方式: 方式一: 在的内部声明如下两个函数: //将线程函数定义为的成员函数 void processThread(int val);//线程实际执行功能段代码 std::thread ...
  • 如何访问成员变量和方法

    千次阅读 2021-03-09 09:42:37
    如何访问成员变量和方法在Java应用程序中,经常需要访问成员变量和方法,以实现程序的功能,请问应该如何访问成员变量和方法?在Java中通过的实例(即对象)点(.)运算符来访问成员变量和方法,今天...
  • C++ 一个类调用另一个成员变量/成员函数

    万次阅读 多人点赞 2015-12-16 15:44:23
    有时候,两个之间并没有继承的关系,但是其中一个需要引用另一个中的成员变量或者成员函数。怎样办到呢? 假设已经新建了两个A、B。 class A { public: A(); ~A(); public: int nAdd; int add(); ...
  • 父类调用子类的成员变量

    千次阅读 2018-05-26 16:55:21
    通过该变量访问它所引用的对象的实例变量时,该实例变量的值由声明该变量的类型决定,但通过该变量调用它引用的对象的实例方法时,该方法行为由它实际所引用的对象来决定,一次当程序访问this.i时,它将访问Base中...
  • mfc中中的成员变量调用问题

    千次阅读 2015-04-03 15:34:45
    最近遇到了一个问题,在VS2010中建立单文档工程,然后里面添加了一个对话框并在对话框...然后在CView调用对话框类中的四个变量进行控制画图操作, 奇怪的是我在CView中定义了对话框类的对象,但是在单击对话框上
  • 在MFC的很多程序中,常常需要在回调函数中调用MFC类成员变量成员函数,亦或者对话框控件的句柄。由于回调函数是基于C编程的Windows SDK的技术,而成员又有this指针客观条件限制...所以在回调函数中不能够...
  • 首先要明白无论调用成员变量还是方法,都需要主调(主语调用者),其格式为:主调.方法/成员变量 别看我们平时可以直接使用方法名/变量名,其实他们都有默认的前缀。如果是static修饰的,默认名为前缀,没有...
  • 编程语言的三大发展阶段:面向机器语言、面向过程语言、面向对象语言 ; 其中面向对象语言主要体现三个特征:封装性、继承、...2、声明的变量称为对象变量,也简称 对象 ; 3、class 关键字是用来定义 ; 4、...
  • //实例化一个对象as.setName("A"); //Studeng *b = new Student();Student *b; //实例化一个指针bb = new Student();b-&gt;setName("B");分析:定义对象基本格式是:Student a;...
  • 内部类调用外部类变量

    千次阅读 2019-09-12 15:07:08
    要求:使用已知的变量,在控制台输出30,20,10。 class Outer { public int num = 10; class Inner { public int num = 20; public void show() { int num = 30; Sy...
  • 静态内部只能引用外部的static成员变量(也就是变量) 如果一个内部不是被定义成静态内部,那么在定义成员变量或者成员方法的时候,是不能够被定义成静态的; 总结: 是否能拥有静态成员:静态内部.
  • 下面介绍类变量的两种定义方式、两种读取方式、在里面的调用方式 定义 1.里定义的,与构造函数、普通函数是一个级别缩进的。(下面例子里的num) 2.在外定义的,直接用类名.变量名新增类变量。(下面例子里...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 882,617
精华内容 353,046
关键字:

怎么调用类的成员变量