Copyright (c) prototype, all rights reserved。
在不对原文内容(包括作者信息)做任何改动的前提下,欢迎自由转载。
0. 必要说明:所谓“废弃”(deprecated, or obsolescent) 的语言特性是指那些在目前的C++标准(ISO/IEC 14882:1998,以下简写为C++98)下仍然是合法的,但在新版标准中很有可能被
去除或
修改(或
保留)的语言特性。
好的C++程序员要熟悉哪些特性是废弃的,并在实际编码时尽量避免使用这些特性。
1.
bool
类型++
操作子
- 实例:
bool b;
b++; // deprecated
++b; // also deprecated
- 说明:在C++98下,对一个bool变量实施++操作的结果是使其值为真。此语义令人费解。概念上,逻辑值并无任何次序内涵,因此不应当对逻辑变量定义增减量操作。
- 替代形式:无。
- 补充:bool类型不同于其它类型的是,虽然C++98为其定义了++操作子,但却没有定义--操作子。
- 参考:C++98条款:5.2.3,5.2.6。
2.
名字空间里的静态对象
- 实例:
static int a; // deprecated use of static
static int b(); // not deprecated
namespace c {
static int d; // deprecated use of static
static int e(); // not deprecated
}
- 说明:严格按C++98来说,名字空间里的静态函数并没有被废弃。在这一点上,委员会内部意见不统一:有人建议修改相应条款也让静态函数被废弃,但也有人建议保留静态对象和静态函数因为把它们非法化会在C++兼容C上造成极大的困难。
- 替代形式:使用匿名空间,如:
namespace {
int a; // 1
// a is not directly accessible by another translation unit.
}
void foo() {
a = 1; // uses `a’ at (1)
}
- 补充:匿名空间里的对象和函数仍具有外部连接性。在类空间里的静态对象和静态函数没有被废弃。
- 参考:C++98条款:7.3.1.1。
3.
访问权限重声明
- 实例:
class A {
int a;
};
class B : public A {
public:
A::a; // `a’ from `A’ becomes public in `B’.
};
void foo() {
B b;
b.a = 1; // ok
}
- 说明:个人感觉这种语法实在是晦涩,应该废之。:-)
- 替代形式:使用using声明,例如:
class B : public A {
public:
using A::a; // `a’ from `A’ becomes public in `B’.
};
- 补充:无。
- 参考:C++98条款:11.3,7.3.3。
4.
常量字符串隐式转化为非常量字符串
- 举例:
char* a = “1345”; // 1
wchar_t* b = “1334”; // 2
- 说明:上例中,`a’和`b’实际指向常字符串。
- 替代形式:使用const char* 或 const wchar_t*。
- 补充:无。
- 参考:C++98条款:4.2。
5.
C
风格的头文件
- 举例:
#include <string.h>
- 说明:C风格的头文件使得所有标识符都进入全局名字空间。使用C++风格的头文件时,这些标识符进入std名字空间。
- 替代形式:使用C++风格的头文件,如:<cstring>。
- 补充:即使使用C++风格的头文件,仍不可在全局名字空间定义与C标准库中同名的标识符,比如:不可在全局名字空间自定义函数int printf( const char*, … ),尽管从C标准库来的相应函数已在std名字空间里,这么做的结果是无定义行为(undefined behavior)。
- 参考:C++98条款:17.4.1.2
6. iostream
和strstream(暂缺)