C和C++的const

来源:互联网 发布:rar解压 for mac 编辑:程序博客网 时间:2024/05/01 06:50

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;        //1j = 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);//函数作用于指向常量的指针
原创粉丝点击