C++11新特性之空指针常量nullptr、泛化的常量表达式constexpr

1、空指针常量nullptr

· 为了解决函数重载是传入NULL(0)的二义性,C++11引入了关键字nullptr充当空指针常量。
    · nullptr的类型是nullptr_t:
        (1) 可以隐式转换为任意类型的指针或者指向任何成员。
        (2) 不能隐式转换为整型,可以隐式转换为bool类型代表false。
        (3) 可以和除了整型和bool型的其他类型比较。

2、泛化的常量表达式(constexpr)

           C++11引入了constexpr关键字,允许用户去保证一个函数或者对象的构造函数是一个编译器常量。

           说明: 

                   a、constexpr是指值不会改变而且在编译过程就能计算结果的表达式。

                   b、一个表达式是不是常量表达式由它的数据类型和初始值共同决定。

                   c、constexpr只对指针有效,对指针所指的对象无关。

                   d、为了使函数获取编译时计算的能力,需要指定constexpr关键字。

                   e、以constexpr修饰的函数被允许应用在调用宏的所有场合。

                    f、编译时使用对象,需要将构造函数声明为constexpr。

                   g、声明为constexpr则包含了const。

3、constexpr函数的限制

           a、函数中只能有一个return语句(有极少特例)

           b、只能调用其他constexpr函数。

           c、只能使用全局constexpr变量。

           d、递归并不受限制,但只允许一个返回语句,可以使用三元运算符。

           e、constexpr函数,只允许包含一行可执行代码。但允许包含typedefs、using declaration&&directives、静态断言等。

            f、一个声明为constexpr的函数同样可以在运行时被调用,即当这个函数的参数是非常量的时候。

constexpr int get_num() 
{
	//int i = 9; error, 函数体内不能声明变量
	return 5; 
}

int main()
{
    int value[get_num() + 7];//C++11合法

	const int i    = 20;//是常量表达式,值不会改变,编译器确定值
	const int i2   = num + 1;//是常量表达式
	int size       = 27; //值会改变
	//const int sz = get_size();//编译器无法确定sz的值

	constexpr int num = 20; //是字面值常量
	constexpr int num2 = num + 1; //是字面值常量
	//constexpr int num3 = getnum();//getnum函数需要是constexpr函数

	int ss = 0;
	constexpr int *p = nullptr; //指向整型的常量指针,p不可变
	int constexpr * r = nullptr;
	const int *q = nullptr; //指向一个整型常量的指针,*q不可变
	int * const m = nullptr;//指向一个整型的常量指针,m不可变
	int const *n = nullptr;//指向一个整型常量的指针, *n不可变
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值