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,那么这个指针就不能改变他所指向的对象,只能改变指向对象的值。即不变的是指针本身(地址不变),可以变的是指针指向的内容。