C++:const, 指针,引用三者在用来赋值时的限制(C11标准)

一、基本概念

我们都知道C++将声明与定义分离开来,extern int i;-->是声明(声明基本都要加extern),int j;-->隐式定义,变量可以声明多次但只能被定义一次。其中一个定义或者声明都是由一个基本类型(base type)和一个声明符组成。

二、各种修饰符的特性

1.引用

引用必须是一个对象,所以引用不可以是一个常量但const int &a = 45 此类除外。

2.指针
除了为空(nullptr, 0, NULL)就是赋值状态,不能隐式初始化。

3.const
被其修饰的变量都需要赋值初始化,但赋的值可以是变量可以是常量

4.const +&:
同类型自然可以相互赋值
const int ci = 1024;
int &r2 = ci;-->自然不行(&引用必须是个对象)

int a = 12;
const int &i = a;-->可以

const int &i = ci; -->此处也是底层const但比较特别

int m = i; // 可以对i进行拷贝,与指针的底层const不能拷贝不同

 

5.const+ *:(涉及顶层const与底层const)
const double pi = 3.14;
只能const double *cptr = π
double *ptr = π -->错误,指向常量的指针不可以进行赋值操作
但cosnt char * str = ".....";
char * temp = str;----->可以,顶层const可以赋值给别人

补充:constexpr修饰的变量必须被一个常量表达式赋值且该变量之后也是const类型

=====================================================================

总结:各个修饰符之间的特性可以叠加(从右往左分析),
const 的顶层与底层的特性:
1.顶层const类型的可以赋值给别人,不能修改自身
2.底层const类型的可以修改自身,但不能赋值给别人(同类型和&的底层const除外),以限制我们不能改变所指对象

注:constexpr(C11新特性)声明的变量均是顶层const

 

 

你可能感兴趣的:(C++:const, 指针,引用三者在用来赋值时的限制(C11标准))