有意思的代码收集

1 c++中的c子集部分与标准c的不同之处:

(1)c中32位机器上 char c = 'a';    sizeof(c) = 1;sizeof('a') = 4;

而在c++中sizeof('a') = 1;

原因:

C99标准的规定,'a'为整型字符常量(integer character constant),被看成是int型,所以在32位机器上占4字节。
C++标准规定,'a'为字符字面量(character literal),被看成是char型,所以占1字节

(2)void*指针赋值给另外一个类型的指针时,c++规定必须进行强制类型转化,而在c中无此要求。

2 c++语义二义性的问题:

 1 class Timer {
 2  public:
 3   Timer();
 4 };
 5  
 6 class TimeKeeper {
 7  public:
 8   TimeKeeper(const Timer& t);
 9  
10   int get_time();
11 };
12  
13 int main() {
14   TimeKeeper time_keeper(Timer());
15   return time_keeper.get_time();
16 }

对于该条语句:TimeKeeper time_keeper(Timer());

可能会被解释为两种情况:

(1) 一个变量定义式(TimeKeeper类型的变量,使用匿名实例对象Timer进行初始化);

(2) 函数声明式(返回值为TimeKeeper类型,参数为函数指针)。

大多数情况下我们期望的是第一种情况,然而,c++标准中却将其解释为第二种。

解决方法:TimeKeeper time_keeper( (Timer()) );增加一队括号,强制编译器将其解释为变量的定义式。

ref:http://en.wikipedia.org/wiki/Most_vexing_parse

posted @ 2012-05-24 23:45  Moon_Bird  阅读(522)  评论(0编辑  收藏  举报