[记]C++11 新特性(1)

  • 宏定义 \__VA_ARGS__
    _VA_ARGS_ 变长参数的宏定义是指宏定义中参数列表的最后一个参数为..., 而实现部分可以用_VA_ARGS_替换
 1 #include     
  2 #include    
  3     
  4 #include    
  5 #include      
  6     
  7 using namespace std;  
  8     
  9 #define LOG(...){\    
 10     printf("%s:%d\t",__FILE__,__LINE__);\
 11     printf(__VA_ARGS__);\
 12     printf("\n");\    
 13 }   
 14     
 15 int main(int args, char*argv[])
 16 {   
 17     LOG("%s", "TEST");
 18                                                                                                                       
 19     return 0;         
 20 }   
g++ -std=c++11 -o cpp11  c11.cpp
-------------------------------------------------
./cpp11 
-------------------------------------------------
 c11.cpp:17      TEST
  • 新的整型 long long/unsigned long long(长度不小于64位)
  1 #include                                                                                                    
  2 #include 
  3 #include 
  4  
  5 using namespace std;
  6  
  7  
  8 int main(int args, char*argv[])
  9 {
 10     long long int lli = 0LL;
 11     
 12     cout << "lli: " << lli << endl;
 13     
 14     cout << "LLONG_MIN: " << LLONG_MIN << endl;
 15     
 16     cout << "LLONG_MAX: " << LLONG_MAX << endl;
 17     
 18     cout << "ULLONT_MAX: " << ULLONG_MAX << endl;
 19     
 20     return 0;
 21 }
g++ -std=c++11 -o cpp11  c11.cpp
-------------------------------------------------
./cpp11
-------------------------------------------------
lli: 0
LLONG_MIN: -9223372036854775808
LLONG_MAX: 9223372036854775807
ULLONT_MAX: 18446744073709551615

参考: cppreference

  • 静态断言static_assert 进行编译时断言检查。
    断言帮助开发者快速定位问题违反程序前提条件的错误,不过断言只在程序运行时执行,这在某些情况下,是不可接受的,特别是对于模板实例化时出现的错误,应该在编译器就确定。在C++11中引入了static_assert断言来解决问题,它支持两个参数输入,一个是返回bool型的表达式,另一个是警告信息。
#include 
int main(void)
{
    static_assert(2 + 2 == 4, "2+2 isn't 4");      // well-formed
    static_assert(sizeof(int) < sizeof(char),
                 "this program requires that int is less than char"); // compile-time error
}
  • noexcept修饰符和noexcept操纵符
    提供给库作者使用,表示函数如果出现异常,不会抛出,编译器会直接调用std::terminate()函数来终止程序运行,从而阻止了异常的的传播和扩散。此外:C++11中类析构函数默认是noexcept(true),不过注意noexcept只会阻止异常的传播和扩散(这对于定位错误很有帮助),而不会阻止异常(如throw语句产生异常的)的发生。
    详情参考cppreference

  • 类成员变量的快速初始化和新的列表初始化,在C++11中,除了静态变量,对于其它变量也允许使用等号或{}进行就地初始化。

class Mem{
public:
    Mem(int i): m(i){};
        ~Mem(){};
    const char *ShowMem(void){  std::cout<<"Mem: "<
  • final和override控制, final用来限制基类虚函数的对应的派生类不能重写该虚函数,从而避免了某些接口被重写覆盖; override则指定了函数必须重载基类的虚函数,否则编译通不过,这就避免了某些输入名或者原型不匹配等错误的发生。
class MathObject{
public:
    virtual double Arith() = 0;
    virtual void Print() = 0;
};

class Printable:public MathObject{
public:
    double Arith() = 0;         //纯虚函数仅允许为0
    void Print() final{    
        std::cout<<"Output is: "<< Arith() <

整理自 cnblogs.com/zc110747
推荐阅读 《深入理解C++ 11:C++11新特性解析和应用》

你可能感兴趣的:([记]C++11 新特性(1))