C# vs C++之一:委托 vs 函数指针
2010-09-30 20:50:02 来源:WEB开发网从上面的代码说明了两个问题:
1.委托对象可以指向不同类的方法,只要符合委托签名;
2.委托对象是有状态的(保存在指向的对象中),委托的行为不仅受到输入参数的影响,还受到目标对象状态的影响。
//C++
typedef int(*Fn)(int a, int b);
int Add(int a, int b) {
return a + b;
};
int Multiple(int a, int b) {
return a * b;
};
class Adder {
public:
Adder(int c) {
this->c = c;
}
int Add(int a, int b) {
return a + b + c;
}
private:
int c;
};
typedef int(Adder::* Fm)(int a, int b);
int _tmain(int argc, _TCHAR* argv[])
{
Fn fn = Add;
std::cout << fn(1, 2) << std::endl;
fn = Multiple;
std::cout << fn(1, 2) << std::endl;
Adder adder(1);
Fm f = &Adder::Add;
std::cout << (adder.*f)(1, 2) << std::endl;
return 0;
}
C#中的委托是一种支持()操作符的特殊对象。这和C/C++的函数指针是有本质区别的,因为C/C++的函数指针变量并不具有对象性质,它只是单纯的函数入口地址。上面的Fn只能指向Add和Multiple两个普通函数,无法指向Adder类的Add方法。因为Adder类的Add方法的签名并非int(*)(int a, int b),编译器会自动加上一个隐式的this指针参数,所以它的签名是类似int(*)(Adder *const this, int a, int b) 的。如果需要指向成员函数的指针,需要用typedef int(Adder::* Fm)(int a, int b)这样的形式加上类型限定符。 所以,C++的函数指针不能像C#委托一样指向不同类的方法;不具有对象的状态性质;在使用上函数指针也不如委托灵活。所以,当听到“委托就是类似C/C++函数指针”的说法的时候应该既理解其相似之处,又明了其差别。
- ››VSFTP服务器配置详解
- ››VS2008 安装失败(“Web 创作组件”无法)的解决办...
- ››VS调用存储过程
- ››VS2005无法远程连接SQL数据库问题
- ››VS2010 Express中文版已经发布至MSDN
- ››VS2008C# 开发 Windows Mobile 6.0程序应注意的几...
- ››VS08中最简单也最实用的Ajax无刷新技术
- ››VS2003+nds OR VS2003+carbide.vs 开发 Symbian 程...
- ››VS2008 平台下进行 Windows Mobile 开发环境的搭建...
- ››VS 2010/.NET 4 RC版 发布了
- ››VS 2010的Intellisense相关崩溃的修补
- ››VS2010 Extension实践
更多精彩
赞助商链接