C/C++ const限定符与引用和指针

一、const 限定符: 通常用来定义一个不能被随便改变的值,用来保护变量

         格式: const 类型 变量名 = value;因为const 限定的变量不能被随便改变,所以在定义的时候必须要初始化。同时,试图对已经定义好的变量进行赋值或者其他改变变量value的操作

             都将引发错误。但是可以间接改变,

          例如:int i=10;  const int &ci= i ;   i=100; 这里最后ci 的值被改变为100;这是引用‘&’的作用,接下来会讲到。

              或者:  const int num = 10;
                       int* p =(int *)#
                        *p = 100;
                        cout << p << " " << &num << endl;

                                                           p保存的地址和num的地址一样,但是*p可以被赋值,这里num的值就被隐式修改了。

二、初始化和const: ci是一个整型常量,但是本质上还是一个整型数,所以可以用ci来赋值或者初始化其他的变量。拷贝的值是不会对ci有任何影响。

三、  默认状态下,const对象仅在文件内有效: 当你定义了一个const 变量 const int buffsize=512;编译器会将代码中所有用到buffsize的地方用512代替,但是这种替代只在文件内有效,

  也就是如果你定义了多个文件file1.cpp ,file2.cpp 等等,并且在file1.cpp文件里定义了buffsize,你就只能在file2.cpp文件里使用buffsize的值,如果你想在file2.cpp文件里使用,你得自己定义一个新的buffsize

  这就相当于在每个文件中buffsize都相当于一个独立的变量。

    但是有时候我们不想编译器为每一个文件分别生成独立的变量,我们想只在一个文件中定义,在其他文件中声明并使用他,就需要extern进行限定。extern表示该变量只定义一次。

  例如在file1中定义 extern const int buffsize=512;在file2.cpp中声明extern const int buffsize;这里的buffsize就是file1中的变量。也就是可以只声明一次,但是value可以在多个文件内共享。

四、const的引用:

  定义引用相当于给变量起一个别名,例如int &ci=i;区别于指针,这里的ci与i共用一个内存单元,指针是各有一个内存单元,在32位机上指针大小是4

字节,64位机上是8字节。并且引用定义是必须初始化,并且不能改变绑定其他的内存空间。

在引用前面加上const 限定符。 int i = 0;const int& ci= i;这里将ci绑定到i上。

  int i=42;

const int &r1=i;

const int& r2=r1;

cosnt int & r3=r1*2;

int &r4=r1*2;

这里只有第五行是错误的,因为常量引用可以被非常量的值或者常量值或者常量引用来初始化,但是非常量的引用不能被常量引用初始化。

五、指针与const

分为两种一种是指向常量的指针,一种是常量指针。

格式 : const int *ci =&value; int *const pi=&value;

这里要区分其实很简单,关键是变量名之前的限定符是‘ * ’,还是const。

如果是‘ * ’,表明本质还是指针,只不过指向的内容是常量,但是也没有规定必须指向常量这点和常量引用相同,不过有一点就是不能通过指针来改变指向对象的值,但是给以改变指针指向的对象,所以本质还是一个指针。

相反,变量前是const,那么这个指针就不能改变他所指向的对象,只能改变指向对象的值。即不变的是指针本身(地址不变),可以变的是指针指向的内容。

 

  

原文地址:https://www.cnblogs.com/zongji/p/12603754.html