不是说静态函数里不可以调用非静态函数吗解决办法
不是说静态函数里不可以调用非静态函数吗
为什么我看到一个例子:
一个静态函数里调用 纯虚函数。
class Test;
静态函数:
static void fun()
{
Test* pTest=获得一个指针(静态容器里的指针)
pTest->纯虚函数();
}
------解决方案--------------------
见下面红色粗体:
你指明调用哪个对象的非静态函数了吗?
------解决方案--------------------
1. 如果静态容器存放了本类的指针, 此时再fun函数里间接获取了本类指针,这种情形可以调用非静态吗?
如果知道了某对象的指针,就相当于知道了该对象的this, 当然可以寻址到对象的成员函数和成员数据。
2. 所谓的不能调用非静态,是包括函数, 数据 两种吗?还是只是数据?
都不能,no-static成员默认都有this指针,表示一个偏移量,编译器在翻译你的代码的时候会把这个this当
成参数传给成员函数,没有对象及没有this,编译期间就会出错。
你要理解this就是一个偏移量,表示对象的基地址。
------解决方案--------------------
静态函数,没有this 指针,不能直接访问,本类的非静态成员(成员函数和成员变量)
只能通过 自己的函数参数中的本类对象,全局变量中的本类对象,以及局部变量中的本类对象,来访问非静态成员(成员函数和成员变量)
换言之,非静态成员
或者隐性的通过 this 指针(直接写成员的名字);
或者显式的通过本类对象(指针,引用)访问.
假设有一个类 A
class A{
public:
void f(){};
int x;
};
定义一个对象,一个引用,一个指针,如下;
A a;
A *p=&a;
A &ref=a;
x ; // 非静态成员函数,访问成员变量,可以这么做.
f(); // 非静态成员函数,访问成员函数,可以这么做.
a.x; ref.x; // 对象,引用,访问成员变量,任何对 x有访问权的函数,可以这样做;
为什么我看到一个例子:
一个静态函数里调用 纯虚函数。
class Test;
静态函数:
static void fun()
{
Test* pTest=获得一个指针(静态容器里的指针)
pTest->纯虚函数();
}
------解决方案--------------------
见下面红色粗体:
静态函数中不可以调用非静态函数?没有这种说法。
非静态函数中有一个隐含的参数this,当在非静态函数中不指明对象直接调用本类的非静态函数fun时,相当于调用this->fun。
而静态函数中不存在this,因此静态函数在调用非静态函数则必须指明目标对象,例如楼主代码中的pTest。
你指明调用哪个对象的非静态函数了吗?
------解决方案--------------------
1. 如果静态容器存放了本类的指针, 此时再fun函数里间接获取了本类指针,这种情形可以调用非静态吗?
如果知道了某对象的指针,就相当于知道了该对象的this, 当然可以寻址到对象的成员函数和成员数据。
2. 所谓的不能调用非静态,是包括函数, 数据 两种吗?还是只是数据?
都不能,no-static成员默认都有this指针,表示一个偏移量,编译器在翻译你的代码的时候会把这个this当
成参数传给成员函数,没有对象及没有this,编译期间就会出错。
你要理解this就是一个偏移量,表示对象的基地址。
------解决方案--------------------
静态函数,没有this 指针,不能直接访问,本类的非静态成员(成员函数和成员变量)
只能通过 自己的函数参数中的本类对象,全局变量中的本类对象,以及局部变量中的本类对象,来访问非静态成员(成员函数和成员变量)
换言之,非静态成员
或者隐性的通过 this 指针(直接写成员的名字);
或者显式的通过本类对象(指针,引用)访问.
假设有一个类 A
class A{
public:
void f(){};
int x;
};
定义一个对象,一个引用,一个指针,如下;
A a;
A *p=&a;
A &ref=a;
x ; // 非静态成员函数,访问成员变量,可以这么做.
f(); // 非静态成员函数,访问成员函数,可以这么做.
a.x; ref.x; // 对象,引用,访问成员变量,任何对 x有访问权的函数,可以这样做;