const
的疑问
const
何时为只读变量,何时是常量
const
常量的判别准则:c++
cosnt
常量才会进入符号表const
常量仍然是只读变量voliatile
修饰的cosnt
常量不会进入符号表在编译期间不能直接肯定初始值的const
标识符,都被做为只读变量处理编程
const
引用的类型与初始化变量的类型数组
#include <stdio.h> int main() { const int x = 1; // 字面量初始化,常量 const int& rx = x; // rx表明只读变量,编译器会为常量x分配一个空间,可是不会被使用,经过别名rx后,可使用这个空间 int& nrx = const_cast<int&>(rx); // 消除只读变量的只读属性,nrx表明的空间和rx是同一段,只不过nrx没有只读属性,是一个普通变量 nrx = 5; rx = 10; printf("x = %d\n", x); printf("rx = %d\n", rx); printf("nrx = %d\n", nrx); printf("&x = %p\n", &x); printf("&rx = %p\n", &rx); printf("&nrx = %p\n", &nrx); volatile const int y = 2; // 用了volatile后,y就不是一个常量了,是一个只读变量 int* p = const_cast<int*>(&y); // 指针指向y的内存空间 *p = 6; printf("y = %d\n", y); printf("p = %p\n", p); // 若是改变了y,则说明不是一个常量,没有放进符号表中 const int z = y; // 这也是一个只读变量 p = const_cast<int*>(&z); *p = 7; printf("z = %d\n", z); printf("p = %p\n", p); // 不一样类型的变量初始化const标识符 char c = 'c'; char& rc = c; const int& trc = c; // 用char型去初始化cosnt int& // 初始化类型不一样的话,将获得一个新的只读变量 rc = 'a'; // 改变rc和 trc就不要紧了 printf("c = %c\n", c); printf("rc = %c\n", rc); printf("trc = %c\n", trc); return 0; }
引用与指针有什么关系?如何理解“引用的本质就是指针常量”?
指针是一个变量:指针
const
修饰成为常量或者只读变量引用只是一个变量的新名字:调试
const
引用使其表明的变量具备只读属性从使用C++语言的角度来看:code
从C++编译器的角度来看内存
在工程项目开发中:开发
#include <stdio.h> int a = 1; struct SV { int& x; int& y; int& z; }; int main() { int b = 2; int* pc = new int(3); SV sv = {a, b, *pc}; // 结构体里面的每一个元素是一个引用 ok int& array[] = {a, b, *pc}; // &array[1] - &array[0] = ? Expected ==> 4 // 数组的每一个元素是引用,每一个元素的地址都是独立的,并不连续,err // C语言有一个特性,数组地址连续,地址递增 // 引用数组会破坏这个特性,因此C++不支持引用数组 printf("&sv.x = %p\n", &sv.x); printf("&sv.y = %p\n", &sv.y); printf("&sv.z = %p\n", &sv.z); delete pc; return 0; }
指针是一个变量引用是一个变量的新名字编译器
const引用可以生成新的只读变量io
在编译器内部使用指针常量实现“引用
编译时不能直接肯定初始值的 const标识符都是只读变量