posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

C++ 入门笔记(3)

Posted on 2007-06-03 18:58 ZelluX 阅读(364) 评论(0)  编辑  收藏 所属分类: C/C++

1. 关于函数指针
The C++ Programming Language上的一段示例代码:
map<string, int> histogram;

void record(const string& s)
{
histogram[s]++;
}

void print(const pair<const string, int>& r)
{
cout << r.first << ' ' << r.second << '\n\;
}

int main()
{
istream_iterator<string> ii(cin);
istream_iterator<string> eos;

for_each(ii, eos, record);
for_each(histogram.begin(), histogram.end(), print);
}

其中record和print是以函数指针的形式传递给for_each的。感觉这种方法最清晰、直接。
Java似乎更多的是用接口来达到类似的效果的,比如Collections.sort(Comparable),通常通过匿名内部类来进行自定义元素的比较,从而排序。但是这在语义上已经不是函数了,而是将被排序对象解释为实现了Comparable接口的对象。
另外Java反射机制中也有Mehod方法,觉得也可以通过传递Method类,然后在sort方法中调用这个Method的invoke方法,这应该更接近函数指针的语义。但没看到过这样的实例。
C#则引入了委托的概念,通过delegate关键字声明该方法。多一个关键字感觉就是啰唆了点。 -,-
现在开始对第一次在Thinking in Java中看到的Callback回调机制有了一点感觉。当时看的时候很难理解。
看来在学习某一门语言的时候有一定其他语言的背景进行比较,很容易加深理解。

2. 使用地址传递结构,减少开销
学C++最不适应的就是指针的应用,因为没有C的基础,尽管高中竞赛用的是Pascal,也用指针实现了trie、图的链式表示等比较复杂的数据结构,但是也没有像C++这样指针穿插在整个程序中的,当然C更多。
C++传递结构时默认是先复制一份拷贝,然后函数操作的是该拷贝,而不是Java中的传递引用(当然Java没有结构这一类型)。
C++ Primer Plus中指出要
1) 调用函数时传递地址&myStruct
2) 形参声明为指针MyStruct *
3) 访问成员使用操作符 ->

3. 将引用用于结构
同样,为了节省时空开销,在函数返回值时尽量使用引用。
const MyStruct & use(MyStruct & mystruct)
注意最好将返回的引用声明为const,否则可以使用这样的代码:
use(myStruct).used = 10;
容易产生语义混乱。
但在某些时候必须去掉const关键字。


只有注册用户登录后才能发表评论。


网站导航: