C++ const引用,指针,constexpr

来源:互联网 发布:visual foxpro和sql 编辑:程序博客网 时间:2024/04/29 05:04

int a;

const int *pr=a;  底层const 指针对指向的变量是否为const并不关心

const int ci;

const &ri= ci;  

或者

int ci;

const int &ri=ci; 都是可以的,const &引用不关心是否引用的为const 变量。

但变量为const,const变量的引用或者指针必须为const

 

常量引用是 对const的引用,

const int &a=12;

const int &a=12.2;

都是可以的,只要初始化常量引用时的表达式结果能转换成引用的类型即可。

double d=12.2;

const int &a=d;

相当于先把d赋值给一个const int 的临时量,再让a作为临时量的引用.

所以当引用不是const时,是不合法的 因为如果合法,即使修改,也只能修改临时量,这样没有意义。

常量表达式是指值为常量,且在编译过程中就能得到结果的表达式。

const int a=20;

const int li=a+1;

const int lia= get_size(); //不是常量表达式,因为无法在程序编译过程中求的函数get_size的返回值。

同样,int const * a=nullptr为常量表达式,因为只有指针值不变,且指向的必须在编译时就能知道才可以。

int a;

int const * pr=a;也可以。

 

c++11中新增了constexpr对常量表达式进行检测,

constexpr int *a=nullptr;

此时a为常量指针,constexpra变成顶层const指针.

之所以会这样,是因为常量表达式指针必须为常量,即为不可修改的值,指针不例外。

const int *a 则是指向常量的指针,底层const指针(所谓顶层,可以理解为const修饰的是变量值,底层是指针指向的值,通过地址,内存地址一般为底层)。

 

 

typedef int * a;

const a b;

此时不等价于const int *b;

而是,b为一个常量指针,指向int;

const int *b中基本数据类型为int*为修饰符,*b说明b为一个指针,const int说明是指向一个const int变量(也可能不是const变量,但无论如何都无法通过b修改此值)

const a b 说明 是基本数据类型,aint *,说明a为指向int 的指针,const说明b无法修改,即为常量。

const a *b

*b说明是指针,a说明是指向int *的指针,const说明无法修改指向的指针。

0 0
原创粉丝点击