废弃的C++语言特性 - Deprecated C++ features explained

Copyright (c) prototype, all rights reserved
在不对原文内容(包括作者信息)做任何改动的前提下,欢迎自由转载。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值