C++ const限定符之顶层const & 底层const & 指针 & 引用之间的关系

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CXHPLY/article/details/49470707

const 限定符

1.const对象必须初始化

1)表达式初始化

const int i = getSize();  //运行时进行初始化

2)常量初始化

const int j = 43; //编译时进行初始化

3)对象处初始化

    int i = 43;

    const int id =i; 

2.限制:只能在const类型的对象上执行不改变其内容操作。

3.可以拷贝,用ci初始化j,无需在意ci是否为常量。拷贝一个对象的值并不会改变它,完成拷贝后,新对象j与原来对象ci没有任何关系。

  const int ci =3;

   int j = ci;  

4.默认状态,const对象仅在文件内有效,若存在多个文件:

  1)每个文件均进行定义。多个文件出现同名const变量,等同于不同文件中分别定义独立变量。

  2)const变量不管声明还是定义都添加extern关键字,如

    //file.c定义并初始化了而一个常量,该常量能被其他文件访问

     extern const int buff = fcn();//初始化了buff,此语句为定义。

     //file.h头文件

     extern const int buff;//与file.c中定义的buff是同一个。此语句为声明。


对const的引用,即对常量的引用(简称常量引用)const int &r2 =2;

1.普通引用的类型必须与所引用对象的类型一致,只能绑定在对象上。但是对于常量引用,符合前述条件之外,还允许将其绑定非常量的对象、字面值,以及表达式。

int &r1 = 0; //普通引用r1未绑定在对象上(错误)

2.正确:引用及其对象都是常量,不可修改ci的值,也不可通过r1修改ci的值

const int ci = 10;

const int&r1 = ci;

3.错误:试图让一个非常量引用指向一个常量对象

const intci = 10;

int &r1 = ci;

4.常量引用仅对引用可参与的操作作出限定,对引用的对象本身是否为常量未作限定。不能通过常量引用修改对象的值。

 int i = 42;

int &r1 = i;  //普通引用r1绑定对象i;

const int&r2 = i;  //常量引用绑定对象i

r1 = 0;  //普通引用r1,作为i的别名,可修改i的值,为0

r2 = 0;  //常量引用r2作为i的别名,不可修改i的值(错误)

不允许r2修改i得到值,但可以通过i或者r1修改该对象的值。


指针和const

[1]指向常量的指针const double *pi = 3.14;

1.不能用于改变其所指对象的值

2.错误:试图让一个普通指针指向一个常量

 const double pi = 3.14; 

double *p = π

3.不能给指向常量的指针赋值

4.普通指针的类型必须与其所指对象的类型一致。在指向常量的指针中,符合前述条件之外,还允许令一个指向常量的指针指向一个非常量对象。要求不能通过该指针改变对象的值,但可通过其他途径改变对象的值(如对const的引用中第4点)

[2]const指针double * const pi = 3.14;

1.必须初始化,一旦初始化后,其值(存放在指针中的地址)不可再改变,即不变的是指针本身的值而非指向的那个值

2.正确:允许一个const指针指向非常量

 int errNumb = 0;

int *constcurErr = &errNumb;





顶层const &底层const 理解上述内容

1.顶层const

表示任意对象本身就是常量,对任何数据类型都适用,如指针常量。

2.底层const

表示所指对象时一个常量,如指向常量的指针。

int i = 0;

int *const p1 = &i; //不能改变p1的值,顶层const

const int ci =42;  //不能改变ci的值,顶层const

const int *p2 = &ci;  //允许改变p2的值,底层const

const int *constp3 = p2; //靠右的const是顶层const,靠左的是底层const

const int &r = ci;  //用于声明引用的const都是底层const

3.用于声明引用的const都是底层const

4.初始化时,

 1)左值为非const,右值为非const或者顶层const。

2)左值为顶层const,右值为非const、顶层const(常量指针指向常量对象除外)

3)左值含有底层const(底层const、顶层const&底层const),右值为非const、顶层const、含有底层const(底层const、顶层const&底层const)。

4)常量指针不可指向常量对象,但可用指向常量的常量指针指向常量对象



5.当执行对象进行拷贝操作时,顶层const与底层const存在区别:

1)顶层const无影响;

2)底层const有限制,拷入拷出的对象必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换。一般来说,非常量可以转换成常量。赋值”=”,左侧为左值,右侧为右值。


对象进行拷贝操作总结:

1)左值为非const,右值为非const或者顶层const。

2)左值为顶层const,不能给左值赋值,因为顶层const是不可改变本身的常量。

3)左值为底层const,可以对其进行赋值拷贝,右值可为非const、顶层const或者具有相同的底层const资格。



猜你喜欢

转载自blog.csdn.net/CXHPLY/article/details/49470707