C++11/14介绍(二)——语言可用性的强化(一)

本文深入探讨C++11/14中nullptr与constexpr的特性和用法。nullptr作为NULL的替代品,解决了C++重载混淆问题;constexpr允许声明在编译期就能确定值的函数或对象,提升代码效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nullptr与constexpr

一、nullptr

  • nullptr的出现是为了替代NULL

  • C++98中,NULL和0是不做区分的,导致以下程序

    void foo(char *a)
    {
        cout<<"String";
    }
    void foo(int a)
    {
        cout<<"Number";
    }
    
    int main()
    {
        char *ch = NULL;
        foo(NULL);
        return 0;
    }
    

    会报警告,因为其导致C++重载特性发生了混乱

  • C++11/14中引入了 nullptr 关键字,专门用来区分空指针、0。nullptr 的类型为 nullptr_t,能够隐式的转换为任何指针或成员指针的类型,也能和他们进行相等或者不等的比较。 编译运行如下程序:

    void foo(char *);
    void foo(int);
    int main() {
    
        if(NULL == (void *)0) std::cout << "NULL == 0" << std::endl;
        else std::cout << "NULL != 0" << std::endl;
    
        foo(0);
        // foo(NULL); // 编译无法通过
        foo(nullptr);
    
        return 0;
    }
    void foo(char *ch) {
        std::cout << "call foo(char*)" << std::endl;
    }
    void foo(int i) {
        std::cout << "call foo(int)" << std::endl;
    }
    

    运行结果:

    NULL == 0
    call foo(int)
    call foo(char*)
    
  • 因此当需要使用 NULL 时候,直接使用nullptr

二、constexpr

  • 一般来说,常量表达式中使用的变量必须被声明为 const,就像:

    int len_foo() {
        return 5;
    }
    int main() {
        int len = 5;
        char arr_1[len+5];          // 非法
        const int len_2 = 10;
        char arr_2[len_2+5];        // 合法
        char arr_3[len_foo()+5];  // 非法
    
        return 0;
    }
    

    虽然编译可以通过,但不建议使用非法的形式

  • constexpr可以让用户显式的声明函数或对象构造函数在编译器会成为常数,这个关键字明确的告诉编译器应该去验证 len_foo 在编译器就应该是一个常数 ,即

    constexpr int len_foo() {
        return 5;
    }
    
  • C++14 开始,constexptr 函数可以在内部使用局部变量、循环和分支等简单语句:

    constexpr int fibonacci(const int n) {
        if(n == 1) return 1;
        if(n == 2) return 1;
        return fibonacci(n-1)+fibonacci(n-2);
    }
    
  • 参考:C++ 11/14 高速上手教程 - 语言可用性的强化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值