C++11新特性总结(相比C++98)

本文详细总结了C++11相对于C++98的重要更新,包括_Pragma("once")、静态断言static_assert、操作符noexcept、快速初始化成员变量、智能指针、多线程编程等特性,旨在帮助开发者更好地理解和利用C++11的新功能。
摘要由CSDN通过智能技术生成

本文列举一下C++11相比C++98的一些重要变化,做一下知识总结和沉淀。

1. C++11 新增_Pragma("once")来保证头文件只会被include一次,用以代替先前的两种写法,_Pragma是一个操作符,可以用在宏定义中,比预处理指令灵活。

1)#pragma once 
2)#ifndef THIS_HEADER
  #define THIS_HEADER
  #endif

2. 变长参数的宏定义是指在宏定义中参数列表的最后一个参数为省略号,预定义宏__VA_ARGS__可以在宏定义的实现部分替换省略号所代表的字符串。

#define PR(...) printf(__VA_ARGS__)

3. 在C++98中,将char转换成wchar_t是未定义行为,到了C++11中,将char和wchart进行连接时,会先将char转成wchar_t,然后再与宽字符进行连接。

4. long long 有两种类型,long long 和unsigned long long ,不同平台可以有不同长度,至少是64位。

5. 经常会发现UINT、_int16、u64、int64_t,这些类型有的是源自编译器的自行扩展,有的则是来自某些编程环境(比如工作在Linux内核),C++标准中只定义了5种标准的有符号类型,同时规定每一种有符号整型都有一种对应的无符号整型版本,且两者具有相同的存储空间,signed char、signed short int、signed int、signed long int、signed long long int。

6. C、C++混用头文件的典型做法如下,可以让如下头文件被#include到C文件中,也可以被#include 到C++文件中, extern "C"可以抑制C++对函数名、变量名等符号进行名称重整,因此编译出的C目标文件和C++目标文件中的变量名和函数名都一样的。

#ifdef __cplusplus
extern "C"{
#endif


.....


#ifdef __cplusplus
"}"
#endif

__cplusplus通常被定义为一个整数值,C++03标准中,其值是199711L, 在C++11中是201103L, 可以据此写出只支持C++11的代码,以下代码插入那些只能用C++11编译器编译的代码中(因为代码含C++11特性)

#if __cplusplus < 201103L
#error "should use c++ 11 implementation"
#endif

7. C++11新增了静态断言static_assert, 即在预处理阶段做一些断言,静态断言的表达式结果必须是在编译期可以计算的表达式,可以放在任何名字空间,包括函数外部。assert只能用于运行时,且只能放在函数内部。

8. 用操作符noexcept替代原先的throw

如下用法已经被c++废弃:
void excpt_func() throw (int , doulbe){}  
void excpt_func() throw(){}
改为如下方式,可以没有常量表达式,默认是true:
void excpt_func() noexcept(常量表达式)

9. 快速初始化成员变量

  • 非常量的静态成员变量,C++98 和C++11 保持一致,都需要到类的头文件以外去定义,保证编译时非常量的类静态成员的定义最后只存在于一个目标文件中。

  • 非静态的成员变量,C++98只能在初始化列表中进行初始化,C++ 11增加支持就地初始化(用{}方式,不能用()方式),若同时对一个非静态的成员变量进行就地初始化和初始化列表初始化,最后起作用的是初始化列表(即后起作用)。

  • 常量的静态成员变量,C++98和C++11都支持就地初始化,C++98只支持整型或者枚举类型

10. C++98, sizeof 只能对实例的变量或者类的静态成员进行操作,不能对类的非静态成员进行操作,若要想达成对类的非静态成员的操作,可以用如下ugly方式, 0强转成对象的指针,并解析访问对应非静态成员变量。C++11之后,可以对类的非静态成员进行操作,无需此ugly方式。

#include <iostream>    


using namespace std;    


struct People{    
    public:    
        int hand;    
        static People* all;    
};    


int main(){    
    People p;    
    cout << sizeof(p.hand) << endl;    


    cout << sizeof(People::all) << endl;    


    cout << sizeof(((People*)(0))->hand) <<endl;    
}

11. friend, C++98 需要friend class XX,即需要关键字class,C++11只需要friend XX,不再要求有关键字class,因这一点改动,可以为类模板声明友元了(以前不行)。如果是基本类型,friend int不会生成。

12. final࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值