纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

C++ const限定符以及顶层const和底层const C++ const限定符以及顶层const和底层const的案例详解

Chancer224   2021-09-10 我要评论
想了解C++ const限定符以及顶层const和底层const的案例详解的相关内容吗Chancer224在本文为您仔细讲解C++ const限定符以及顶层const和底层const的相关知识和一些Code实例欢迎阅读和指正我们先划重点:C++,const限定符,C++,const限定符详解下面大家一起来学习吧

一、const限定符的作用

  当我们在写程序的时候想定义一种变量它的值不会被改变这时就可以用const限定符来定义变量也可称它为常量常量的定义必须要有初始值否则编译错误其实际例子是用一个变量来表示缓冲区的大小的时候

  对内置类型用const是比较通俗易懂的其作用就是不能对用const定义了的变量进行修改(写)但可以进行拷贝(读)

const int bufSize = 512;    //正确
const int bufSize2;    //错误const对象必须要初始化    
int buffer[bufSize];
 
const int a = 1;
int b = 2;
a = 3;    //错误不能对常量进行赋值    
b = a;    //正确

二、const和引用

  在我的理解中引用就相当于一个常量它在初始化时就已经与一个对象绑定在一起之后就不能绑定其他对象这种专一的品质非常值得我们学习而当用const对引用进行定义时它的作用就是说明该引用绑定的对象是一个常量不能对该引用进行修改(事实上常量引用绑定的对象不一定是常量常量引用中的“常量”这两个字的意思其实是引用觉得其绑定的对象是一个常量但该绑定的对象是变量也是合法的下面通过代码详细说明)

//非常量引用
int a = 0;
int &r = a;
r = 1;    //通过操作引用来对a赋值此时相当于a=1
 
//常量引用绑定常量
const int b = 1;    //b是一个常量
const int &r2 = b;    //正确
r2 = 5;      //错误不能对常量引用进行修改
b = 5;    //错误
 
//常量引用绑定变量
int c = 1;
const int &r3 = c;    //正确常量引用也可以绑定变量
r3 = 5;    //错误不可修改常量引用
int d = r3;    //正确常量引用可读该值为c
c = 5;    //正确可修改变量
 
//非常量引用不可绑定常量
const int e = 1;
int &r4 = e;    //错误

  以上四种情况已说明const和引用的关系为何第四种情况中不可用非常量引用绑定常量呢这是因为我们已经定义了e是一个不可修改的常量假如我们用非常量引用成功绑定了它并且可以通过修改引用来使e的值改变这不就违背了e作为常量其值不可改变的理念了吗所以第四种情况编译器是会报错的

  常量引用中的const的作用是针对引用绑定的对象的指所绑定的对象是一个常量这叫做底层const

三、const和指针

  引用不是一个对象因此const不能针对引用起作用只能对引用的绑定对象起作用但指针是一个对象所以指针和const之间有三种组合方式:1.常量指针2.指向常量的指针3.指向常量的常量指针其三者作用如下代码所示

//1、常量指针
//常量指针指向变量即常量指针中的地址不能修改
int a = 1;
int b = 2;
int *const p = &a;    //正确常量指针可以指向变量
p = &b;    //错误常量指针中的地址值不能修改
*p = 2;    //正确p的解引用是a的值a是变量可以修改该值
 
//2、指向常量的指针
//即指针中的地址可以修改但指向的对象是常量不能用解引用修改值(实际上指向的对象可以是变量)
int c = 3;
const int d = 4;
int e = 5;
const int f = 6;
int const *p2 = &c;    //正确指向常量的指针可以指向变量
const int *p3 = &d;    //正确指向常量的指针指向常量
p2 = &e;    //正确可以改变指向的地址
p3 = &f;     //正确
*p2 = 0;    //错误虽然p2实际指向的是一个变量但操作p2的解引用时p2把指向的对象看作常量因此不能通过解引用来修改对象的值
c = 0;    //正确不能通过p2的解引用修改c但c自身是变量可以修改
*p3 = 0;    //错误同理p2
f = 0;    //错误
 
//3、指向常量的常量指针
//即指针中的地址不可以修改指向的对象是常量也不能用解引用修改值(实际上指向的对象可以是变量)
int g = 1;
const int h = 2;
const int *const p4 = &g;    //正确
const int *const p5 = &h;    //正确
p4 = &h;    //错误不能修改值
*p4 = 0;    //错误不能修改其解引用

  对象的类型确定了对象的操作因此指向常量的指针它的“常量”两字不是限制指针指向的对象必须是常量而是限制了指针的解引用操作因为指向常量的指针和常量引用一样是一个自以为是的家伙它认为自己指向的一定是一个常量所以对指向常量的指针进行解引用让指针认为在对一个常量进行修改因此这是非法的行为

四、顶层const和底层const

1、顶层const

  何为顶层const其定义为对象本身是一个常量因此对一切的内置类型常量而言所有的const都是顶层const而对于指针而言常量指针是顶层const对于引用则没有顶层const的概念以下代码都是顶层const

const int a = 1;
const double val = 3.14;
const string str = “hello”;
int *const p = &a;

  顶层const的对象一旦完成初始化就不能修改其值但可以作为被拷贝对象进行拷贝操作如下代码所示

const int b = 1;
b = 2;    //错误顶层const不能修改值
int c = b;    //正确顶层const可以被拷贝
int *const p2 = &b;
*p2 = 0;    //错误实际指向的为常量不能修改其解引用
p2 = &c;    //错误顶层const不能修改值
 
int *const p3 = &c;
*p3 = 3;    //正确实际指向的为变量可以修改其解引用
 
const int *p4 = p2;    //正确顶层const可以被拷贝
*p4 = 0;    //错误p4是底层const(下面解释)不能修改其解引用

  有些朋友可能对const int *p3这句定义语句有疑问其实它和int const *p3是一样的都是指向常量的指针也是一个底层const(下面介绍)而以上代码说明顶层const对象不能修改但可以被拷贝因为被拷贝的过程中是可以忽略顶层const的

2、底层const

  底层const这个概念只在指针和引用上有效其定义是该指针指向或该引用绑定的对象是常量因此指针可以有顶层const和底层const而引用只有底层const

int a = 0;
int const *p = &a;    //底层const
const int &r = a;    //底层const

  很多朋友可能分不清一个指针到底是底层const还是顶层const这里可以教大家一个方法就是看变量名最近的声明符是什么例如const int *p最近的声明符是*因此他是一个指针第二个声明符才是const因此他是一个指向常量的指针;又例如int *const p2最近的声明符是const因此p2是一个常量第二个声明符才是*因此它是一个常量指针其实大家只要记住一个就行各人有各人的方法最紧要自己觉得好用啦

  了解了底层const那么我们分析一下底层const可以进行哪些操作以下为代码

int a = 0;
const int b = 0;
int const *p = &a;    //底层const可以指向常量也可以指向变量因为对于&a该类型可以从int*转换为const int*因此可以说成对象被拷贝时可以忽略其顶层const
 
//对于引用的底层const即是常量引用
const int &r = a;    //绑定一个变量
r = 0;    //错误引用的底层const不可以修改值
int c = r;  //正确
const int d = r;    //正确
int &r2 = r;    //错误
const int r3 = r;    //正确  
 
//对于指针的底层const即指向常量的指针
//修改指针的值
p = &b;    //正确指针的底层const可以修改值
*p = 2;    //错误指针的底层const不可以修改解引用的值
 
//指针被拷贝
int *p2 = p;    //错误
int *const p3 = p;    //错误
int const *p4 = p;    //正确
const int *const p5 = p;    //正确p5有顶层和底层const 

  对于引用的底层const因为引用没有顶层const对于它的操作特性可以从它绑定了一个常量这个基础去理解实际它不一定绑定常量但在使用常量引用时要看成他始终绑定了一个常量那么它的修改和被拷贝是否允许就比较清楚了

  对于指针的底层const指针把自己指向的对象视为常量所以我们修改解引用的值时相当于修改指向的那个常量对象的值这是不允许的所以编译器报错但指针不是常量指针(没有顶层const)因此可以修改指针的值(指向的对象可以改变)当有底层const的指针用作被拷贝的对象是其底层const就不能忽略了拷入和拷出的对象必须都要有底层const才能对底层const指针进行拷贝操作

对指针const限定符的总结:

  1. 顶层const不能修改值但其解引用可能可以修改(根据实际指向的对象决定)
  2. 顶层const作为被拷贝值时没有限制可以被忽略
  3. 底层const可以修改值但其解引用不能修改
  4. 底层const在用作拷贝操作时要求拷入与拷出值都有相同的底层const(都是底层const或都不是)不能忽略

相关文章

猜您喜欢

  • Java中的BeanInfo 有关Java中的BeanInfo介绍

    想了解有关Java中的BeanInfo介绍的相关内容吗御狐神在本文为您仔细讲解Java中的BeanInfo的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Java中的BeanInfo,Java,BeanInfo下面大家一起来学习吧..
  • C语言BF与KMP模式匹配 C语言字符串的模式匹配之BF与KMP

    想了解C语言字符串的模式匹配之BF与KMP的相关内容吗Stay--hungry在本文为您仔细讲解C语言BF与KMP模式匹配的相关知识和一些Code实例欢迎阅读和指正我们先划重点:C语言BF,C语言KMP下面大家一起来学习吧..

网友评论

Copyright 2020 www.sopisoft.net 【绿软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式