当前位置:主页 > c/c++教程 > C++常量详解

C++常量详解一(常量指针与常量引用的初始化)

发布:2022-07-25 09:22:55 59


本站精选了一篇C++相关的编程文章,网友夏琳爰根据主题投稿了本篇教程内容,涉及到C++常量详解、C++常量详解相关内容,已被114网友关注,内容中涉及的知识点可以在下方直接下载获取。

C++常量详解

1、常量

1.1、常量的初始化:
const对象一旦创建后其值就不能再改变,所以const对象必须初始化。这里我们要注意一点,像const int *p和const int &r都并不是const对象。因为const int *p只是表示不能通过p改变p所指的对象的值,p的值是可以变的,所以p可以不用初始化。至于r ,引用本身就不是对象,所以r也并不是const对象,r之所以一定初始化,是因为引用必须初始化。对于以上内容,你也可以理解为底层const 修饰的并不是const对象,还要注意像const int *const p1这种,这是一定要初始化的,这是const对象,因为它有一个顶层const。

1.1.1分清了const对象后,让我们先把目光聚集到const对象这里。

  const对象可以分为大致三类:

 const int m
 int *const p
 const int *const q

而这前两类都可以用来给非const对象或者const对象初始化,因为这前两类都是顶层const,初始化时的拷贝是不会对他们的自身值做出什么改变,即以下代码均正确。

//第一类
int m1=m;//正确
const int m2=m;//正确
//第二类
int *p1=p;//正确
int *const p2=p;//正确
const int *p3=p;//正确
const int *const p4=p;//正确  

而第三类则需要我们注意一下,因为第三类还有一个底层const。
const int *const q

int *q1=q;//报错
int *const q2=q;//报错
const int *q3=q;//正确
const int *const q4=q;//正确

底层const有一个限制:当执行对象的拷贝操作时,拷入和拷出的对象必须具有相同的底层const。
我们可以这样理解:const int *const q如果可以拷贝初始化给q1、q2,那么意味着我们可以通过q1、q1来改变q所指的对象的值,那这样q的底层const还有什么意义呢?

以上,是说这三类可以给哪些对象初始化,现在我们看看哪些可以给这三类初始化

第一类const int m

//以下一些变量不初始化,我把重点落在类型。
int m1;
const int m2;
const int m=m1;//正确
const int m=m2;//正确

第二类int *const p

//以下一些变量不初始化,我把重点落在类型。
int *p1;
int *const p2;
const int *p3;
const int *const p4;

int *const p=p1;//正确
int *const p=p2;//正确
int *const p=p3;//错误
int *const p=p4;//错误

这里的报错同样因为底层const有一个限制:当执行对象的拷贝操作时,拷入和拷出的对象必须具有相同的底层const

第三类 const int *const q

//以下一些变量不初始化,我把重点落在类型。
int *q1;
int *const q2;
const int *q3;
const int *const q4;

const int *const q=q1;//正确
const int *const q=q2;//正确
const int *const q=q3;//正确
const int *const q=q4;//正确

1.1.2 现在让我们把目光转回非const对象的初始化
这里主要有两类:

//以下一些变量不初始化,我把重点落在类型。
const int *p;
const int &r;

先考虑他们可以给哪些对象初始化
第一类 const int *p

//以下一些变量不初始化,我把重点落在类型。
int *p1=p;//报错
int *const p2=p;//报错
const int *p3=p;//正确
const int *const p4=p;//正确

此处同样由于低层const的限制

第二类 const int &r

//以下一些变量不初始化,我把重点落在类型。
int &r1=r;//错误
const int &r2=r;//正确

这里强调一下,引用不是对象,所以没有像 int *const &r或者const int *const &r这种形式

好,再考虑哪些可以给他们初始化
第一类 const int *p

//以下一些变量不初始化,我把重点落在类型。
int *p1;
int *const p2;
const int *p3;
const int *const p4;

const int *p=p1;//正确
const int *p=p2;//正确
const int *p=p3;//正确
const int *p=p4;//正确

因为const int *p意义在于表明不可以通过p改变它所指的对象的值,这个对象可以不是常量,只是p所指的对象对于p来说是常量,所以它所指的对象是否const 其实并没有关系。

第二类 const int &r

//以下一些变量不初始化,我把重点落在类型。
int &r1;
const int &r2;
const int &r=r1;//正确
const int &r=r2;//正确

这里const同样是指不能通过r改变它所引用的对象,所以它所引用的对象本身是不是const无关紧要。
纵观以上的错误,都是试图把底层const拷贝初始化给没有底层const的对象。
以上就是关于涉及到常量的指针和引用的初始化的解释了。


参考资料

相关文章

  • C++实现数字转换为十六进制字符串的方法

    发布:2022-04-16

    这篇文章主要介绍了C++实现数字转换为十六进制字符串的方法,涉及C++操作数字与字符串转换的相关技巧,需要的朋友可以参考下


  • C++连接mysql的方法(直接调用C-API)

    C++连接mysql的方法(直接调用C-API)

    发布:2022-06-21

    给大家整理一篇关于C++的教程,首先安装mysql,点完全安装,才能在在安装目录include找到相应的头文件,注意,是完全安装,需要的朋友可以参考下


  • 用C/C++来实现 Node.js 的模块(二)

    发布:2022-07-12

    为网友们分享了关于Node的教程,上篇文章的主要内容讲诉了用C/C++来实现 Node.js 的模块,本文更深一步继续探讨这个问题,有需要的朋友可以参考下


  • Lua和C/C++互相调用实例分析

    发布:2022-06-23

    给网友们整理关于C++的教程,今天小编就为大家分享一篇关于Lua和C/C++互相调用实例分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧


  • C++保存txt文件实现方法代码实例

    发布:2022-04-08

    这篇文章主要介绍了C++保存txt文件实现方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下


  • 你真的知道C++对象大小吗?

    发布:2022-04-20

    这篇文章主要给大家介绍了关于C++对象大小的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • JNI实现最简单的JAVA调用C/C++实例代码讲解

    发布:2019-09-02

    这篇文章主要介绍了JNI实现最简单的JAVA调用C/C++代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • 浅谈C++函数声明后面加throw()的作用(必看)

    发布:2022-04-14

    下面小编就为大家带来一篇浅谈C++函数声明后面加throw()的作用(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧


  • 深入理解C++中的new/delete和malloc/free动态内存管理及区别介绍

    发布:2022-06-23

    给大家整理一篇关于C++的教程,这篇文章主要介绍了深入理解C++中的new/delete和malloc/free动态内存管理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下


  • C++实现教师管理系统

    发布:2022-04-16

    这篇文章主要为大家详细介绍了C++实现教师管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


网友讨论