不是说静态函数里不可以调用非静态函数吗

zrdongjiao 2013-07-09 05:31:59
为什么我看到一个例子:
一个静态函数里调用 纯虚函数。

class Test;

静态函数:

static void fun()
{
Test* pTest=获得一个指针(静态容器里的指针)
pTest->纯虚函数();
}
...全文
356 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
漫步者、 2013-07-10
  • 打赏
  • 举报
回复
static void fun() { Test* pTest=获得一个指针(静态容器里的指针) pTest->纯虚函数(); } 注意: 是不能调用该类本省的非静态数据。
漫步者、 2013-07-10
  • 打赏
  • 举报
回复
剩下2个问题: 1. 如果静态容器存放了本类的指针, 此时再fun函数里间接获取了本类指针,这种情形可以调用非静态吗? 2. 所谓的不能调用非静态,是包括函数, 数据 两种吗?还是只是数据? 注意: 1,静态容器不是就作为了你的private成员,与你的内置类型没有区别。 2,数据:方法(函数)和属性的集合。
lm_whales 2013-07-10
  • 打赏
  • 举报
回复
静态函数,没有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有访问权的函数,可以这样做; a.f(); ref.f(); // 对象,引用,访问成员函数,任何对 f有访问权的函数,可以这样做; p->x; // 指针,访问成员变量,任何对 x 有访问权的函数,可以这样做; p->f(); // 指针,访问成员函数,任何对 f 有访问权的函数,可以这样做;
AndyStevens 2013-07-10
  • 打赏
  • 举报
回复
1. 如果静态容器存放了本类的指针, 此时再fun函数里间接获取了本类指针,这种情形可以调用非静态吗? 如果知道了某对象的指针,就相当于知道了该对象的this, 当然可以寻址到对象的成员函数和成员数据。 2. 所谓的不能调用非静态,是包括函数, 数据 两种吗?还是只是数据? 都不能,no-static成员默认都有this指针,表示一个偏移量,编译器在翻译你的代码的时候会把这个this当 成参数传给成员函数,没有对象及没有this,编译期间就会出错。 你要理解this就是一个偏移量,表示对象的基地址。
zrdongjiao 2013-07-10
  • 打赏
  • 举报
回复
引用 10 楼 zrdongjiao 的回复:
[quote=引用 8 楼 ganpengjin1 的回复:] static void fun() { Test* pTest=获得一个指针(静态容器里的指针) pTest->纯虚函数(); } 注意: 是不能调用该类本省的非静态数据。
确实,我搞混了, 它调用的不是本类的。 剩下2个问题: 1. 如果静态容器存放了本类的指针, 此时再fun函数里间接获取了本类指针,这种情形可以调用非静态吗? 2. 所谓的不能调用非静态,是包括函数, 数据 两种吗?还是只是数据? [/quote] 我均验证了,发现问题1, 问题2都可以。 看来 所谓的静态不能调用非静态, 可以绕过去编译器的限制
zrdongjiao 2013-07-10
  • 打赏
  • 举报
回复
引用 8 楼 ganpengjin1 的回复:
static void fun() { Test* pTest=获得一个指针(静态容器里的指针) pTest->纯虚函数(); } 注意: 是不能调用该类本省的非静态数据。
确实,我搞混了, 它调用的不是本类的。 剩下2个问题: 1. 如果静态容器存放了本类的指针, 此时再fun函数里间接获取了本类指针,这种情形可以调用非静态吗? 2. 所谓的不能调用非静态,是包括函数, 数据 两种吗?还是只是数据?
橡木疙瘩 2013-07-10
  • 打赏
  • 举报
回复
引用 4 楼 zrdongjiao 的回复:
[quote=引用 2 楼 mujiok2003 的回复:] [quote=引用 楼主 zrdongjiao 的回复:] 不是说静态函数里不可以调用非静态函数吗
不能通过this调用非静态函数。 [/quote] 好吧,如果静态函数可以调用 非静态的东西 那么为什么大名鼎鼎的widnows 的线程函数 当成为成员函数的时候 此时在线程函数里使用非静态成员就回报错呢? 说明 静态函数是不能够直接操作一切非静态的东西。 放过来:一切非静态的东西可以直接操作 静态的东西。 [/quote] 见下面红色粗体:
引用 1 楼 u010936098 的回复:
静态函数中不可以调用非静态函数?没有这种说法。 非静态函数中有一个隐含的参数this,当在非静态函数中不指明对象直接调用本类的非静态函数fun时,相当于调用this->fun。 而静态函数中不存在this,因此静态函数在调用非静态函数则必须指明目标对象,例如楼主代码中的pTest。
你指明调用哪个对象的非静态函数了吗?
ztenv 版主 2013-07-09
  • 打赏
  • 举报
回复
那么为什么大名鼎鼎的widnows 的线程函数 当成为成员函数的时候 此时在线程函数里使用非静态成员就回报错呢? 你是怎么让windows线程函数成为你类的成员函数的?
zrdongjiao 2013-07-09
  • 打赏
  • 举报
回复
引用 5 楼 lianshaohua 的回复:
[quote=引用 4 楼 zrdongjiao 的回复:] [quote=引用 2 楼 mujiok2003 的回复:] [quote=引用 楼主 zrdongjiao 的回复:] 不是说静态函数里不可以调用非静态函数吗
不能通过this调用非静态函数。 [/quote] 好吧,如果静态函数可以调用 非静态的东西 那么为什么大名鼎鼎的widnows 的线程函数 当成为成员函数的时候 此时在线程函数里使用非静态成员就回报错呢? 说明 静态函数是不能够直接操作一切非静态的东西。 放过来:一切非静态的东西可以直接操作 静态的东西。 [/quote] 呵呵,不用这样吧?[/quote] 我说的,我亲自验证过的啊,不骗你的啊 晕
ztenv 版主 2013-07-09
  • 打赏
  • 举报
回复
引用 4 楼 zrdongjiao 的回复:
[quote=引用 2 楼 mujiok2003 的回复:] [quote=引用 楼主 zrdongjiao 的回复:] 不是说静态函数里不可以调用非静态函数吗
不能通过this调用非静态函数。 [/quote] 好吧,如果静态函数可以调用 非静态的东西 那么为什么大名鼎鼎的widnows 的线程函数 当成为成员函数的时候 此时在线程函数里使用非静态成员就回报错呢? 说明 静态函数是不能够直接操作一切非静态的东西。 放过来:一切非静态的东西可以直接操作 静态的东西。 [/quote] 呵呵,不用这样吧?
zrdongjiao 2013-07-09
  • 打赏
  • 举报
回复
引用 2 楼 mujiok2003 的回复:
[quote=引用 楼主 zrdongjiao 的回复:] 不是说静态函数里不可以调用非静态函数吗
不能通过this调用非静态函数。 [/quote] 好吧,如果静态函数可以调用 非静态的东西 那么为什么大名鼎鼎的widnows 的线程函数 当成为成员函数的时候 此时在线程函数里使用非静态成员就回报错呢? 说明 静态函数是不能够直接操作一切非静态的东西。 放过来:一切非静态的东西可以直接操作 静态的东西。
qzf362269994 2013-07-09
  • 打赏
  • 举报
回复
静态调用的意思是静态决定被调用的函数
mujiok2003 2013-07-09
  • 打赏
  • 举报
回复
引用 楼主 zrdongjiao 的回复:
不是说静态函数里不可以调用非静态函数吗
不能通过this调用非静态函数。
橡木疙瘩 2013-07-09
  • 打赏
  • 举报
回复
静态函数中不可以调用非静态函数?没有这种说法。 非静态函数中有一个隐含的参数this,当在非静态函数中不指明对象直接调用本类的非静态函数fun时,相当于调用this->fun。 而静态函数中不存在this,因此静态函数在调用非静态函数则必须指明目标对象,例如楼主代码中的pTest。

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧