C++11/14介绍(一)——弃用特性和与C语言的兼容性

一、弃用特性

  • 如果一个类有析构函数,为其生成拷贝构造函数和拷贝赋值运算符的特性被弃用了

    class test
    {
    public:
        test(){}
        ~test(){}
    };
    int main()
    {
        test A;
        test B(A);
        test C = A;
        return 0;
    }
    
  • C++98 异常说明、 unexpected_handler、set_unexpected() 等相关特性被弃用,应该使用 noexcept

    void myunexpected () {
    	cerr << "unexpected called\n";
    	throw 0;     
    }
    void myfunction () throw (int) {
    	throw 'x';   
    }
    int main (void) {
    	set_unexpected (myunexpected);
    	try {
    		myfunction();
    	}
    	catch (int) {
    		cerr << "caught int\n";
    	}
    	catch (...) {
    		cerr << "caught other exception (non-compliant compiler?)/n";
    	}
    	return 0;
    }
    
  • register 关键字被弃用

    int main()
    {
    	register int i;
        int sum = 0;
        for(i=0;i<=100;i++)
            sum+=i;
        return 0;
    }
    
  • bool 类型的 ++ 操作被弃用

    bool a = 0;
        a++;
    
  • C 语言风格的类型转换被弃用,应该使用 static_cast、reinterpret_cast、const_cast 来进行类型转换

    int main()
    {
    	unsigned a,b;
        int i,j;
    
        a=65535;
        i=-1;
        j=a;
        b=i;
        
        printf("(unsigned)%u→(int)%d\n",a,j);
        printf("(int)%d→(unsigned)%u\n",i,b);
        return 0;
     }
    

    以上代码在C++98/11/14都是可以正常编译通过的,这也说明了弃用不等于废弃,只是这些特性将从未来的标准中消失,应该尽量避免使用

  • 不再允许字符串字面值常量赋值给一个 char *。如果需要用字符串字面值常量赋值和初始化一个 char *,应该使用 const char * 或者 auto

    int main()
    {
        char *str = "Hello";
        //const char *str = "Hello" 合法
        //auto *str("Hello") 合法 
        cout<

    在C++98标准下,会提示警告:这是已经弃用的特性。在C++11/14标准下,会提示警告:禁止这样的转换

  • auto_ptr 被弃用,应使用 unique_ptr

    int main()
    {
        auto_ptr str(new string("abcd"));
        return 0;
    }
    

    在C++98标准下不会报错,在C++11/14标准下,会提示警告:auto_ptr已经被弃用

二、与C的兼容性

  • C++ 几乎是 C 的超集,只有少量功能 C++ 不支持。

  • C语言
    C++11/14介绍(一)——弃用特性和与C语言的兼容性_第1张图片

  • C++
    C++11/14介绍(一)——弃用特性和与C语言的兼容性_第2张图片

  • 使用C++还是C

    • C++ 和 C 的设计哲学并不一样,两者取舍不同,所以不同的程序员和软件项目会有不同选择,难以一概而论。与 C++ 相比,C 具备编译速度快、容易学习、显式描述程序细节、较少更新标准(后两者也可同时视为缺点)等优点。在语言层面上,C++ 包含绝大部分 C 语言的功能(例外之一,C++没有C99的变长数组VLA),且提供 OOP 和 GP 的特性。但其实用 C 也可实现 OOP 思想,亦可利用宏去实现某程度的 GP,只不过 C++ 的语法能较简洁、自动地实现OOP/GP。C++ 的 RAII(resource acquisition is initialization,资源获取就是初始化)特性比较独特,C/C#/Java 没有相应功能。回顾历史,Stroustrup 开发的早期 C++ 编译器 Cpre/Cfront 是把 C++ 源代码翻译为 C,再用 C 编译器编译的。由此可知,C++ 编写的程序,都能用等效的 C 程序代替,但 C++ 在语言层面上提供了 OOP/GP 语法、更严格的类型检查系统、大量额外的语言特性(如异常、RTTI等),并且 C++ 标准库也较丰富。有时候 C++ 的语法可使程序更简洁,如运算符重载、隐式转换。但另一方面,C 语言的 API 通常比 C++ 简洁,能较容易供其他语言程序调用。因此,一些 C++ 库会提供 C 的 API 封装,同时也可供 C 程序调用。相反,有时候也会把 C 的 API 封装成 C++ 形式,以支持 RAII 和其他 C++ 库整合等。

参考(已经通过原作者授权):C 与 C++ 的真正区别在哪里?

​ C++ 11/14 高速上手教程 - C++11/14 简介

你可能感兴趣的:(C++,C++11/14)