周四

Posted on 2008-03-27 17:07 RichardHe 阅读(152) 评论(1)  编辑 收藏 引用
(1)对const的用法过去不是很明白,不过今天看了<<effective c++>>里面有一个巧妙的理解
1 char *p            = "hello";             // 非const指针,
2                                           // 非const数据
3 const char *p        = "hello";           // 非const指针,
4                                           // const数据
5 char* const p        = "hello";           // const指针,
6                                           // 非const数据
7 const char* const p    = "hello";         // const指针,
8                                           // const数据
一般来说,你可以在头脑里画一条垂直线穿过指针声明中的星号(*)位置,如果const出现在线的左边,指针指向的数据为常量;如果const出现在线的右边,指针本身为常量;如果const在线的两边都出现,二者都是常量。

(2)“通过值来传递一个对象”的具体含义是由这个对象的类的拷贝构造函数定义的。这使得传值成为一种非常昂贵的操作。
如下面的代码:
1 student returnstudent(student s) { return s; }
2 student plato;                     // plato(柏拉图)在
3                         // socrates(苏格拉底)门下学习
4 returnstudent(plato);                 // 调用returnstudent 

这个看起来无关痛痒的函数调用过程,其内部究竟发生了些什么呢?

简单地说就是:首先,调用了student的拷贝构造函数用以将s初始化为plato;然后再次调用student的拷贝构造函数用以将函数返回值 对象初始化为s;接着,s的析构函数被调用;最后,returnstudent返回值对象的析构函数被调用。所以,这个什么也没做的函数的成本是两个 student的拷贝构造函数加上两个student析构函数。


为避免这种潜在的昂贵的开销,就不要通过值来传递对象,而要通过引用:

1 const student& returnstudent(const student& s)
2 return s; }
这会非常高效:没有构造函数或析构函数被调用,因为没有新的对象被创建。

引用几乎都是通过指针来实现的,所以通过引用传递对象实际上是传递指针。因此,如果是一个很小的对象——例如int——传值实际上会比传引用更高效。

Feedback

# re: 周四  回复  更多评论   

2008-03-27 20:56 by yanvenhom
const char *p,const是修饰char的。
char* const p,const是修饰p的。
握手,这个东东我也前不久刚搞懂。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


posts - 94, comments - 138, trackbacks - 0, articles - 94

Copyright © RichardHe