免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2423 | 回复: 10
打印 上一主题 下一主题

[函数] 一个函数指针的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-05 15:00 |只看该作者 |倒序浏览

  1. #include <iostream>

  2. using namespace std;

  3. class A
  4. {
  5.   public:
  6.     void foo();
  7. };
  8. void A::foo()
  9. {
  10.   cout << "Print foo" << endl;
  11. }

  12. int main()
  13. {
  14.   typedef void (A::*MyType)();
  15.   MyType boo = &A::foo;

  16.   A a;
  17.   a.foo();         //ok
  18.   (a.*boo)();      //ok
  19.   //a.(*boo)();    //不行,为什么呢?

  20.   return 0;
  21. }
复制代码

为什么a.(*boo)(); 不行?

论坛徽章:
0
2 [报告]
发表于 2007-06-05 16:02 |只看该作者
因为*boo的语义是不明确的

(a.*boo)()的语义则是明确的

实际上, 成员函数foo隐含了
它是要作用于this指针的
也就是要作用于调用该成员函数的对象

所以, a.*boo意义明确:调用成员函数,作用于a
而*boo则意义不明确

论坛徽章:
0
3 [报告]
发表于 2007-06-05 16:36 |只看该作者
原帖由 ypxing 于 2007-6-5 16:02 发表
因为*boo的语义是不明确的

(a.*boo)()的语义则是明确的

实际上, 成员函数foo隐含了
它是要作用于this指针的
也就是要作用于调用该成员函数的对象

所以, a.*boo意义明确:调用成员函数,作用于a
而*boo则 ...


那为什么a.foo()的语义明确呢?和a.(*boo)()有什么本质的不同呢?

论坛徽章:
0
4 [报告]
发表于 2007-06-05 17:01 |只看该作者
原帖由 litao19 于 2007-6-5 16:36 发表


那为什么a.foo()的语义明确呢?和a.(*boo)()有什么本质的不同呢?


a.foo()其实相当于foo(&a),意义就是调用成员函数,作用于对象a
我觉得很明确

a.A::foo()与a.foo()的作用是相当的,

我想,a.(A::foo)()与a.(*boo)()应该是相当的
(两者编译时有一个错误是相同的error: expected unqualified-id before ‘(’ token)

a.(A::foo)()这种写法,编译器可能会单独解释A::foo,而不会同时考虑a
因为错误是:
error: expected unqualified-id before ‘(’ token
error: invalid use of non-static member function ‘void A::foo()’

论坛徽章:
0
5 [报告]
发表于 2007-06-05 17:12 |只看该作者
原帖由 ypxing 于 2007-6-5 17:01 发表


a.foo()其实相当于foo(&a),意义就是调用成员函数,作用于对象a
我觉得很明确

a.A::foo()与a.foo()的作用是相当的,

我想,a.(A::foo)()与a.(*boo)()应该是相当的
(两者编译时有一个错误是相同的erro ...

有道理,呵呵,谢谢

论坛徽章:
0
6 [报告]
发表于 2007-06-05 22:27 |只看该作者
>> 为什么a.(*boo)(); 不行?

这是因为:
  • C++ 中不存在 .(* 运算符
  • C++ 中也不存在 .( 运算符
  • 由于以上两个原因,这个语句中的 . 只能解释为类成员访问运算符。此运算符在语法上要求其右操作数必须是一个 id-expression(标识符表达式)。与一般表达式不同,标识符表达式不含括号形式。

评分

参与人数 1可用积分 +3 收起 理由
langue + 3

查看全部评分

论坛徽章:
0
7 [报告]
发表于 2007-06-05 23:17 |只看该作者
a.*boo

写法虽然可以,但是也近乎莫名其妙了.

论坛徽章:
0
8 [报告]
发表于 2007-06-06 01:50 |只看该作者
编译器实现。
没有什么好的理由来说明,如果没有标准规定该怎么实现这种语法,任何语法都是可行的。

论坛徽章:
0
9 [报告]
发表于 2007-06-06 08:48 |只看该作者
原帖由 思一克 于 2007-6-5 23:17 发表
a.*boo

写法虽然可以,但是也近乎莫名其妙了.


.* 是 C++ 的一个运算符,称为指向成员的指针(pointer-to-member)运算符。

论坛徽章:
0
10 [报告]
发表于 2007-06-06 08:55 |只看该作者
原帖由 tearinheaven 于 2007-6-6 01:50 发表
编译器实现。
没有什么好的理由来说明,如果没有标准规定该怎么实现这种语法,任何语法都是可行的。


应该是标准的规定,而不是实现问题。

在语言语法上,如果标准没有规定编译器就不能实现。你上面说的情况适用于“无定义行为”,所以我想你可能把这两者混淆了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP