C++中的const关键字系列——常类型与常指针之间的纠缠

来源:互联网 发布:网络招聘平台 靠谱吗 编辑:程序博客网 时间:2024/05/22 14:34

说起const这个关键字,想必大家都不会陌生了。因为在高级编程语言的范畴内,几乎都有这么一个关键字。

因为最近的一段时间内在类的设计与实现的时候,有某些需求是要用到const修饰符来修饰那些变量或是函数的,所以在用的同时也去百度了一下,同时也在看林锐博士的<高质量C++/C编程指南>,还有<C++ Primer>,<Effective C++>这三本书中的const部分。在不断的学习过程中不断的做总结,先从常类型与常指针之间的关联总结起吧。


const可以修饰一个类型,语义:指示这个类型的变量是不可改变的。(当然这个也不是绝对的,因为有编译保护和运行保护的区别吧,至于具体的实现,那就是看编译器本身的实现了,这个在后面讨论)

先看四句代码:

char chs_no_const1[] = "hello";char chs_no_const2[] = "hello";const char chs_const1[] = "hello";const char chs_const2[] = "hello";
变量名:chs_no_const1,说明这是一个字符数组,但不是常字符。chs_const说明这是一个常字符数组类型变量名。

这里前两句代码用一个字符串去初始化一个非常字符数组,这个字符串被作为一个普通变量对待,存储于栈区,可改的,例如chs_no_const[0] = 'A';

但是像上面四句中的后面两句,是不能通过数组名修改数组值的。

还有这里要区别的是下面这句代码:

char *cptr = "hello";
用字符串初始化一个字符型指针,这个字符串会被看做是一个常量对待,存储于常量区,而且是不能通过这个指针去修改字符串的,例如下面的代码是错误的:cptr[0] = 'A';


一:非常字符型 非常指针

char *cp_non = chs_no_const1; //non-const pointer,non data;

变量cp_non说明:char类型指针pointer,且全为非常类型

这里用一个非常字符型指针来接受一个非常字符型数组名是可以的,而且是可以通过这个指针来修改数组的值的,

如:cp_non[0] = 'A'; 当然这个指针也是可以去指向其他的非常字符数组的。例如cp_non = chs_no_const2;是正确的。但是下面的是错误的:cp_non = chs_const1;


二:常字符型 指针:指向常字符的指针,指针可改指向,但是字符作为常量不允许修改。

const char *cp_const_char1 = chs_no_const1; //常字符数组或是非常字符数组都可以将其数组名赋给一个指向常字符的指针char const *cp_const_char2 = chs_const1; cp_const_char2 = chs_const2; //指向常字符的指针当然可以指向其他的常字符或非常字符

变量cp_const_char说明:是字符型指针,并且是指向常字符类型的。两种不同的方式去声明常字符型指针,const char *或者是char const *。在类型名的左右侧均可,但要保证是在"*"的左侧指明是常类型而不是常指针。

常字符型指针可以接受长字符数组,也可以接受非常字符数组,他还可以修改其指向,但是均不能通过常字符型指针来修改其所指的内容。


三:字符型 常指针:因指针也是一种类型,所以const也可以修饰一个指针,此时指针作为一个常量不允许被修改。

char * const cp_const_point2 = chs_no_const1;

变量:cp_const_point说明:字符型指针,且是常指针,但指向的是非常字符类型。因为指针指向的是非常字符数组,所以只能用非常字符数组来初始化了,语句:char * const cp_const_point1 = chs_const1;是错误的,因为字符型常指针不能接受一个常字符数组名。

这里的指针作为一个常量,和其他类型的常量一样的声明方式,只能在初始化时就赋初值,且不允许后面再次被赋值。下面的是错误的:cp_const_point2 = chs_no_const2; 因为常指针必须被初始化,而且一旦初始化就不能改其指向。

值得一提的是前面的指针是不允许修改其所指向的内容的,但是这里的指针虽然不能改变指向了,但是却可以通过指针去修改其所指向的内容。cp_const_point2[0] = 'A';这句代码是正确的。

当然这样子的一个指针是不允许接受一个常字符数组的,这点和第一条一样。


四:常字符型 常指针

const char * const cp_double_const1 = chs_const1;const char * const cp_double_const2 = chs_no_const1;

变量cp_double_const说明:字符指针,且既是常类型也是常指针。

这个是常字符型 指针与字符型 常指针的用法的交集,用法更为苛刻。声明的同时必须初始化,且不允许后面再次被赋值。而且还只能接受常字符型数组,其余用法均错。


原创粉丝点击