C语言标准
CC89 新(C99 inline const)
C++C++99 新(C++11,C++14)
const(const都不能为左值)
C中(C89):const int a = 10; 常变量
常变量不能当常量使用,如做数组下标。
C++中(C++99):const int a = 10; 常量,必须初始化
const编译时用常量替换,*(&a) 取地址解引用,编译器优化为a。
int c = 10;
const int a = c;初始化为变量,则a退化为常变量,同C中。
C和C++ const 的区别
编译时const的方式不同
引用(没有几级引用)
int a = 10;
int &b = a; 引用初始化,引用初始化后不能再引用其他内存。
- 引用在汇编中相当于指针,同样开辟一个指针大小空间压入栈中,用于存储引用内存的地址。
- 访问引用内存,直接解引用。
- &b取引用地址访问不到b在栈区开辟的地址,访问的是a的地址。
- C++11标准中有左值,右值引用。
int array[ ] = {1,2,3,4,5};
int (*p)[5] = &array;
int (&b)[5] = array;
sizeof(b) = sizeof(array) = 20
sizeof(p) = 4
char *array[ ] = {"hello","bbb","ccc"};
char *(*p)[3] = &array;
char *(&b)[3] = array;
sizeof(p) = 4 sizeof(b) = 12
const:编译器必须保证const修饰的值不能直接或间接被修改。
间接:打算把一个常量的地址放到一个普通的指针里面,就错了。
错误的转换:const int * => int *
const 修饰右边的 * 时,const参与类型。
const int &c = 10;
/* const int temp = 10;
const int &c = temp; */
#include <typeinfo> 打印变量类型
重载的第三条:
看能不能通过修改形参,来影响实参的值。