美文网首页
const 限定符详解

const 限定符详解

作者: 谁是我的小超人 | 来源:发表于2017-08-18 22:57 被阅读0次

背景

const 限定符的使用经常出现混淆,所以在此总结。

const 限定符与初始化

  1. const 对象
    const 对象一旦创建就不能改变,因此,必须初始化。
  • const 对象与初始化
  • 不改变const 对象的操作中有一种是初始化操作。//注解:改变const 对象的行为是会被拒绝的,但初始化操作是不在范围内的。
int i = 42 ; 
const int ci = i; // ture 
int j =  ci ; // ture
  1. const 与引用
  • 复合类型
  1. 引用与指针都是属于复合类型;

变量的定义 = 基本数据类型 + 声明符

  • const 的引用(reference to const)
const int ci = 1024;
const int &r1 = ci; // ture;
r1 = 42; //false,对常量的引用不能被用作修改他所绑定的对象
int &r2 = ci;// false,底层const的拷贝,只能从非const 拷贝到const;反之,则不行。
  • 引用的类型必须与其所引用的对象的类型一致,但是有个例外:初始化常量引用时,允许用任意表达式作为初始值;只要该表达式的结果能转化成引用的类型即可。
int i = 42;
const int &r1 = i; // ture 
const int &r2 = 42; // ture
const int &r3 = r1 * 2;// ture;
int &r4 = r1 * 2; // false ,r4是普通的非常量引用

实现基础:编译器将生成中间变量

double dval = 3.14;
const int &ri = dval;

生成中间的参量

const int temp = dval;
const int &ri = temp;

3.const 与指针

  • 指针
    指针是对象,存放的是对象的地址
  • 指向const 的指针(point to const)
    不能用于改变其所指对象的值
    想要存放常量对象的地址,必须使用指向常量的指针
const double pi = 3.14;
double *ptr = pi; // false,ptr只是一个普通指针
const double * cptr = pi; // ture
*cptr = 42;
  • const 指针
    指针是对象,因此可以把他定义为常量。
int errNumb = 0;
int *const curErr = &errNumb; // 不能改变所指对象
const double pi = 3.14;
const double *const pip = π //指向常量对象的常量指针;

4.常量指针和引用都可以指向非常量
5.顶层const 与底层const

  • 顶层const 表示任意对象是常量
  • 底层const 表示所指对象是const
int i = 0;
int *const p1 = &i; //顶层const;
const int ci= 42;
const int *p2 = &ci; //底层const,p2可以改变
const int *const p3 = p2; //右侧是顶层const,左侧是底层const
const int &r = ci; // 所有引用都是底层const;

6.对象执行拷贝工作时,顶层与底层const 差别很大。顶层基本不受影响,但底层与差别。

i = ci; // 顶层const 无影响
p2 = p3; // p2, p3 所指对象相同,忽略p3的顶层const 属性
  • 底层const 的受限比较多,所指对象必须一致,或者可以相互转化。一般来说,可将非常量转化成常量
int *p = p3; // false,p3包含底层const
p2 = p3; // ture;
p2 = &i; // ture, int * 转化成 const int *
int &r = ci; // false ,普通int 无法绑定到const int 
const int &r2 = i; // const int 可以绑定到 int ;
### 总结:
const 本质上是个常量的声明;因此常见的初始化语句(本质上都是拷贝语句)都可以忽略const,不管是作为左值还是右值;拷贝语句也可以忽略const;但是存在两种复杂的复合结构:指针和引用。他们所指的类型必须和其本身的类型一致或者可转化。

相关文章

  • const 限定符详解

    背景 const 限定符的使用经常出现混淆,所以在此总结。 const 限定符与初始化 const 对象const...

  • C++11新特性(4)- const, const expres

    const限定符 const可以用于定义变量,它的值不能被改变。 const int bufSize = 512;...

  • C++类型转换

    const_cast const_cast转换符是用来移除变量的const或volatile限定符。 上述转换也可...

  • 笔记07:C++中的const

    1,const 限定符 const int i = 0;,使用const可以将i变成一个常量,当试图对i的值进行修...

  • const限定符

    const限定符 const对象一旦创建就不可以改变,所以必须初始化,可以用复杂的表达式或者常量来初始化。 例: ...

  • const限定符

    1、解决神秘数字(魔数)的问题 写个数字,不知道代表什么意思。就叫神秘。定义一个变量的话容易被修改 ,定义成con...

  • Const 限定符

    前言:认真学习一下 C++,感觉光会 Go 没啥用。读一读《C++ Primer》 基本知识 const 对象一旦...

  • C++ const用法

    const限定符 在变量前面加上const,也可以创建一个常量。使用const创建常量的一般格式如下: 使用con...

  • C++笔记(2)

    这次学习的是const,C++是一种很坑爹的东西,连const都能玩出这么多的花样。 const 限定符 cons...

  • C++ const总结

    const限定符在C++中非常常见,有以下几种用途 const修饰一般变量 const修饰的变量必须初始化,原因是...

网友评论

      本文标题:const 限定符详解

      本文链接:https://www.haomeiwen.com/subject/paqzrxtx.html