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——传值实际上会比传引用更高效。