1.const限定符在c和c++中的区别:
在C语言中,任何变量的声明都可以使用const限定符限定,该限定符指定的变量不能被修改。
在C++中,const是定义了一个常量。并且在C++中,const还可修饰成员函数。
2.const常量和#define宏定义的区别:
宏定义在预处理阶段就将标识符替换成了符号序列,在源码进入编译器之前,它会被预处理器直接忽略掉,所以它的标识符不会加入到符号表当中,如果涉及到这个常量在编译时报错,就会很难找出,因为这个问题会出现在符号调试器当中,但是符号名却不会出现在符号表中。
const有类型安全检查。尽量使用const而不是#define
3.const的普通常量和初始化
因为const对象一旦创建之后其值就不能再改变,所以必须初始化
const int i = getsize(); //运行时初始化
const int j = 1; //编译时初始化
const int k; //错误,未经初始化的常量
如果利用一个对象去初始化另一个对象,他们是不是const都无所谓。
int a = 42;
const int b = a; //正确
int c = b; //正确
4.const的引用
把引用绑定到const对象上,称为常量引用,对常量的引用不能被用作修改它所绑定的对象。
const int a = 1;
const int &b = a;
a = 2;
//错误
int &c = b; //错误,试图让一个非常量引用指向一个常量引用
int &d = a; //错误,同上
引用的类型必须与其所引用对象的类型一样,但是有
两种例外,一种就是在初始化常量引用时,允许用任意表达式作为初始值,只要改表达式的结果能转换成引用的类型即可。
int i = 1;
const int &a = i;
//正确
const int &b = 1;
//正确
const int &c = a*2;
//正确
int d = a*2; //错误
对const的引用可能引用一个并非const的对象
int i = 0;
int &j = i;
const int &k = i;
i = 1;
cout<<k; //1
j = 2;
cout<<k; //2
5.指针和const
指向常量的指针不能用于改变其所指对象的值,要想存放常量的地址,只能用指向常量的指针。
const int i = 1;
int *p = &i;//错误,p是一个普通指针
const int *q = &i;
*q = 2; //错误,不能给q赋值
常量指针:允许把指针本身定为常量,必须初始化,而且一经初始化,指针的指向就不能再发生改变。
int a = 0;
int *const b = &a; //b将一直指向a;
const int c = 1;
const int *const d = &c; //d是一个指向常量对象的常量指
指针本身是一个常量并不意味着不能通过指针修改其所指对象的值,能否这样做,完全依赖于所指对象是否被const修饰。
int a = 0;
int *const b = &a; //b将一直指向a;
*b = 2; //通过将常量指针解引用来改变a的值,注意这里仅仅改变的是非常量整数a的值,而指针的指向并没有改变
如果const出现在*的左边,则指针指向的数据为常量,即指向常量的指针;
如果const出现在指针的右边,则指针本身是常量,即常量指针;
6.顶层const
顶层const表示指针本身是个常量;
底层const表示指针所指的对象是一个常量。
更一般的,顶层const可以表示任意的对象是常量,这一点对任何数据类型都适用;
底层const则与指针和引用等符合类型的基本类型部分有关;
比较特殊的是,指针类型既可以是顶层const也可以是底层const
7.const与类的成员
*const成员函数(常量成员函数):在函数的参数列表之后紧随的const关键字,这里const的作用是修改隐式this指针的类型,将其改为指向常量的常量指针;默认情况下,this是指向类类型非常量版本的常量指针,所以默认情况下一个常量对象就不能调用普通的成员函数。
*常量对象,以及常量对象的引用及指针 都只能调用常量成员函数。
*构造函数不能被声明成const的。
*当我们创建一个类的常量对象时,直到构造函数完成初始过程,对象才能真正取得其常量属性,因此,构造函数在const对象构造过程中可以向其写值。
*当类的成员变量为const(或引用)时,必须将其初始化,我们初始化该数据成员的唯一机会就是通过构造函数初始值(初始化列表)。
8.const与重载
*顶层const不影响函数传入的对象,因此一个拥有顶层const的形参无法和一个没有顶层const的形参区分开。
例如
int Func(int a);
int Func(const int a);//重复声明了Func;
*若形参是某类型的指针或引用,则通过它指向的否是常量对象可以构成重载,此时的const是底层的。
例如
int Func(int &a); //函数作用于整型的引用
int Func(const int &a)//函数作用于常量引用
int Func(int *a);//函数作用于指向整型的指针
int Func(const int *a);//函数作用于指向常量的指针