这个含义的多重性能导致一些难以发现的错误:
// copy a string from pSource to pTarget -- incorrect version.
while(pSource)
{
*pTarget++ = *pSource++;
}
此例中的while循环试图把由pSource指向的源字符串复制到由pTarget指向的内存块。但不幸的是,条件写错了,它应这样写出:
// copy a string from pSource to pTarget -- incorrect version.
while(*pSource)
{
*pTarget++ = *pSource++;
}
你可以看到,当由pSource指向的字符为NULL时,终止条件出现。这是0的第四定义。然而,这里写出的代码却是去查看地址pSource是否为零,这是第二定义。
最终结果是while()循环继续写入内存直到程序崩溃。
0的其他定义之间也可能产生混乱。唯一的解决办法就是当你使用常数0的时候小心一点。
声明的混乱处
复合声明是非常混乱的,但C++--以它的热忱保持了与C的反向兼容性--但也产生了一些声明间的矛盾,你必须避免这种矛盾。
class Myclass
{
public:
Myclass(int nArg1 = 0,int nArg2 = 0);
};
Myclass mcA(1,2);
Myclass mcB(1);
Myclass mcC();
mcA是参数1和2构成的对象,而mcB是参数1和0构成的对象。因此你可能认为mcC是参数0和0构成的对象,然而情况不是这样。而mcC()是一个不带参数的函数,它用数值返回类Myclass的对象。
另一个混乱产生于初始化运算符=的使用:
Myclass mcB = nA; // same as Myclass mcB(nA)
为了增强与C的兼容性,答应这样使用=;然而你应该避免这种结构,因为它不是一贯适用的。例如下列程序就不会有预期的效果:
Myclass mcA = nA,nB;
这说明一个对象mcA(nA),它后面有一个独立的使用缺省构造符的对象nB,而不是说明一个对象mcA(nA,nB)。
坚持使用C++格式--这是最安全的。
相关推荐:北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |