免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: donglongchao
打印 上一主题 下一主题

[C++] 我觉得应该在c++成员函数的参数中加入this指针 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-07-15 15:19 |只看该作者
x.fun(...) 等价于 X.fun(x, ...),用对象来调用方法的话,第一个参数(self)自动绑定为该对象, ...
emacsnw 发表于 2010-07-15 15:07

那c++中能不能这样呢?

论坛徽章:
0
12 [报告]
发表于 2010-07-15 15:21 |只看该作者
觉得是个扯淡的想法,欢迎拍砖
srdgame 发表于 2010-07-15 15:16


只是一时的想法,为了理解啊。

论坛徽章:
0
13 [报告]
发表于 2010-07-15 15:56 |只看该作者
那c++中能不能这样呢?
donglongchao 发表于 2010-07-15 15:19



    用对象来调用方法,
   在VC中不是编译器做了事情,使得方法的最后一个参数(this指针)绑定了对象么 ?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
14 [报告]
发表于 2010-07-15 21:03 |只看该作者
回复 1# donglongchao

我也觉得应该这样。
在有了f(o, a1, a2, ... ); 的情况下, 加入一个o.f(a1, a2, ... ); 本身就是很短视的设计。
凭什么让o处于特殊的地位?  就因为它是"所谓的对象"?

lua在这点上更明显。
若o是一个table, o.f是 o["f"]的同义词。
若f是一个函数, 就可以:
f = o.f;
f( a1, ... o, ... , a2 ... ); //o并不一定是第1个参数

当o是第1个参数的时候:
f(o, a1, a2, ... );

可以使用这样的语法:
o:f(a1, a2, ... );


也就是说函数从根本上讲, 是free function, 而不是member function
o@f 这种调用记法只是一种语法糖
这样的设计会简化很多问题。


C++没有这样设计, 而是真正支持member function( 有个参数一定是隐式且固定 )。
x = X();
y = Y();
x.f();
y.g();

而在lua中:
x:f()
y:g()
x.f(y)
y.g(x)

python一样:
x.f()
y.g()
X.f(y)
Y.g(x)


C++是做不到的, 那个this参数一定是被隐式且固定的传入。
要选择不同的?  要么用汇编, 要么写一个转发函数:

class X
{
f()


}
F(X* x) { reutrn x->f(); }


因为C++加入了member function这样憋足的设计, 又不得不加入pointer to member function。
写一个callable, 要同时考虑pointer to function和pointer to member function。
这是主要麻烦之一。


主要麻烦之二: f( a , b, ... ) 才是真正范化的记法, o.f( c, d, ...) 不是。
如果有2个以上的"对象"怎么办?

C++有一个multimethod的draft, 引入新的记法以支持多分派:
void f(virtual X&, virtual Y&, ... );

看到没, 终究还是回到了free function


Java和C#更离谱, 将free function都淘汰了。
class Program { static void Main
啥狗屁东西。
Math.abs 狗屁。

无妨, 本来这2语言也就是快餐+短视的。

C#还支持一种叫extension method还是别的什么名字来着。
class X
{
R f() { ... }
}

然后是怎样一个语法忘记了, 大致是

extension
{
static R g(X x, ... );
}

X x = new X();
x.f( a, b, ... );
extension.g(x, a, b, ... );

// 然后又有个什么语法
using extension还是什么来着, 就可以:
x.g( a, b );

无聊。


我认为, 语言直接支持free function, 且只有free function。
这样, 设计callable的时候少很多麻烦。
然后支持一种"函数调用的中缀记法" —— 可以将函数写在参数之间。

这样根本就不需要pointer to member function(或者新的multimethod记法)或者是extension。
而且, 是比它们更范化的设计: "特殊的对象"可以有多个, 且位置不定。

比如:
f( a, b, c ,... );

可以记为(仅仅是记法不同):
a@f( b, c, ... );
(a,b)@f( c, ... );
(a,c)@1,3->f(b);

等等。

如果将@理解为., 那第1种就是所谓的member function。
第2种直接支持multi method且突出多态对象。
第3种可以玩一些有趣的变化, 要演示代码就多了, 不写了。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
15 [报告]
发表于 2010-07-15 21:09 |只看该作者
回复 8# donglongchao

python中的methon 分为bound和unbound。

  1. class X:
  2.      def __init__(self):
  3.          self.a = 1;
  4.      def fun(self,x):
  5.          return self.a+x.a
复制代码
X.fun 就是一个unbound method。
需要2个参数:

X.fun(x, y)


x = X() 之后,
x.f就是一个bound methdon, self是x, 不需要传入。
x.f(y) -> X.f(x, y)
x.f(x) -> X.f(x, x)

相当于是在X()的初始化过程中:
x.fun = lambda other: X.fun(x, other)

也可以这样:
x.fun = X.fun  重新设置为一个unbound method。
x.fun( x, y ) // 必须2个参数

论坛徽章:
0
16 [报告]
发表于 2010-07-15 23:22 |只看该作者
回复  donglongchao

python中的methon 分为bound和unbound。X.fun 就是一个unbound method。
需要2个参 ...
OwnWaterloo 发表于 2010-07-15 21:09

那python中如何实现静态成员函数呢?记不得了。。。

论坛徽章:
0
17 [报告]
发表于 2010-07-16 00:05 |只看该作者
OwnWaterloo 依旧如此犀利~

论坛徽章:
0
18 [报告]
发表于 2010-07-16 00:43 |只看该作者
反对和赞成Python类成员函数的第一个参数的限制的人一半一半.

论坛徽章:
0
19 [报告]
发表于 2010-07-16 09:02 |只看该作者
反对和赞成Python类成员函数的第一个参数的限制的人一半一半.
ideawu 发表于 2010-07-16 00:43

求出处。。。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
20 [报告]
发表于 2010-07-21 21:56 |只看该作者
回复 16# donglongchao

@staticmethod
def f() :
    ....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP