-
2019-02-27 17:01:40
在Java中同类中的静态方法不可以调用类成员变量以及静态方法。
因为因为java中静态的东西是类级别的,也就是说用类名就可访问,也可以用任何对象名访问。更多相关内容 -
C++ 包含类两个类互相调用彼此的类成员变量和方法
2017-09-13 16:16:04C++,C 包含类两个类互相调用彼此的类成员变量和方法,里面介绍了如何在头文件中创建相互的类对象,简单易懂 -
C++回调函数中调用类中的非静态成员变量或非静态成员函数
2019-09-16 19:55:09本文主要介绍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.列表初始化与构造函数初始化区别
当采用列表初始化的时候,代码直接调用了成员变量的构造函数,只需要一步就可以完成。
而在构造函数中初始化的时候,先调用的是成员变量的默认构造函数构造了类成员,然后再调用赋值运算符对之前默认构造的类成员进行赋值,这实际上进行了两步操作。
当类的结构较为复杂的时候,会存在性能上的差异。 -
Python3中成员方法调用成员变量 , 成员方法调用成员方法
2019-05-19 10:46:13成员方法中调用成员变量语法格式 : …self .变量名 例: 成员方法中调用成员方法格式 : …self . 方法名(实参1 , 实参2, …) 例 : self : 仅出现在成员方法中 , 指代执行该方法的对象 ...成员方法中调用成员变量语法格式 :
…self .变量名
例:
成员方法中调用成员方法格式 :
…self . 方法名(实参1 , 实参2, …)
例 :
self : 仅出现在成员方法中 , 指代执行该方法的对象
-
静态方法可以调用成员变量吗?
2017-07-22 09:46:15static是类级别方法 也就是可以 类名.方法调用 不加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:161. 静态方法只能直接调用静态成员(包括变量和方法),而不能直接访问类中的非静态成员 2. 静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所... -
调用 另一个类(同包/不同包)中的方法,成员方法,成员变量
2021-02-12 17:10:40调用 另一个类中的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也不是成员变量 -
成员变量、类变量和静态变量三者的区别
2019-08-17 19:16:36实例变量(成员变量) 在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。 当一个对象被实例化之后,每个实例变量的值就跟着确定; 实例变量在对象... -
java中对象怎么调用成员变量与成员方法
2021-02-12 12:38:53成员变量;对象名.成员方法();成员变量的默认值:(免费学习视频教程分享:java视频教程)具体实例代码:public class StudentTest_01 {public static void main(String[] args) {//创建对象格式,类名 对象名 = new ... -
C++ 两个包含类互相调用彼此的类成员变量和方法
2017-09-13 16:23:00C++ 两个包含类互相调用彼此的类成员变量和方法 -
Java子类的成员方法可以直接调用父类的成员方法和成员变量
2021-08-15 17:10:05public 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... -
C++ 学习之路 (7)一个类调用其他类的成员变量或函数
2018-12-03 00:16:02我的目录结构如下: 因为我在使用的是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.... -
多线程调用类的成员变量或者说类的内部调用多线程问题--及公共资源竞争安全的问题
2018-09-27 14:06:10多线程调用类的成员变量或者说类的内部调用多线程的方式: 方式一: 在类的内部声明如下两个函数: //将线程函数定义为类的成员函数 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类中定义了对话框类的对象,但是在单击对话框上 -
VC MFC C++ 回调函数中调用MFC类的成员变量/函数/控件
2020-08-28 11:17:43在MFC的很多程序中,常常需要在回调函数中调用MFC类的类成员变量、类成员函数,亦或者对话框控件的句柄。由于回调函数是基于C编程的Windows SDK的技术,而类成员又有this指针客观条件限制...所以在回调函数中不能够... -
关于类方法里不能调用实例方法/成员变量(即静态方法里不能调用非静态方法和成员变量)的论述
2019-02-26 12:53:14首先要明白无论调用成员变量还是方法,都需要主调(主语调用者),其格式为:主调.方法/成员变量 别看我们平时可以直接使用方法名/变量名,其实他们都有默认的前缀。如果是static修饰的,默认类名为前缀,没有... -
Java类定义、成员变量定义、方法定义、成员变量与局部变量的区别
2020-01-30 16:16:48编程语言的三大发展阶段:面向机器语言、面向过程语言、面向对象语言 ; 其中面向对象语言主要体现三个特征:封装性、继承、...2、类声明的变量称为对象变量,也简称 对象 ; 3、class 关键字是用来定义类 ; 4、... -
c++——类对象和类指针(作用基本一样:都是为了调用类的成员变量和成员函数)
2018-05-10 14:05:24//实例化一个类对象as.setName("A"); //Studeng *b = new Student();Student *b; //实例化一个类指针bb = new Student();b->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... -
Java中静态变量/成员变量、静态内部类/成员内部类小节
2021-04-14 17:19:18静态内部类只能引用外部类的static成员变量(也就是类变量) 如果一个内部类不是被定义成静态内部类,那么在定义成员变量或者成员方法的时候,是不能够被定义成静态的; 总结: 是否能拥有静态成员:静态内部类. -
Python类变量、实例(成员)变量和局部变量
2020-04-05 13:41:14下面介绍类变量的两种定义方式、两种读取方式、在类里面的调用方式 定义 1.类里定义的,与构造函数、普通函数是一个级别缩进的。(下面例子里的num) 2.在类外定义的,直接用类名.变量名新增类变量。(下面例子里...