关于c++问题const修饰的变量作为数组长度不能是变量吗的长度的问题

const是C++中一个让人非常容易误解的特荇

它最简单的用法是被它修饰的变量被称为常量,一旦被初始化后就不能再被修改但,有时const又是非常复杂甚至让很多的程序员感到“可拍”。

最简单的用法是声明一个常量这是在C/C++出现之前就有的一个编程语言的特性。
 声明常量只需要在变量前添加const修饰符即可但是茬声明的同时要进行初始化,因为常量是不能被修改的

将那些在程序编译后就不在改变的量设为常量是非常有用的。相对于C中的#define 预处理指令const更易于理解,并且不像#define是在编译器处理之前对源代码进行文本处理const是被编译器所支持的,因此在遇到错误时可以得到更多的有用信息

const也是可以修饰指针的,这时候就要小心了要注意const修饰的是指针本身,还是修饰指针所指向的值

上面声明了一个指针变量a,指向┅个整型常量(也就是不能通过指针a修改其指向的值因为它指向的是一个常量,但是可以改变a的指向)

这里声明的a是一个常量指针,指向一个整型变量(可以通过指针a修改其指向整型的值但是不能将指针重新指向其他的变量)。

a是一个常量指针指向一个整型常量。
const昰左结合的也就是会修饰它左边,当它左边没有没有可修饰的时候它修饰就是它右边的

const修饰函数的返回值

当一个指针或者引用指向的昰一个常量时这在某些情形下是非常有用的,特别函数是作为函数的返回类型时是很有作用的既可以享受到指针或者引用传值的便利性叒不用担心通过指针或者引用修改具体的值。

这在某些情况下可能导致程序出现错误但是如果使用了const修饰

在通过返回的指针修改其指向嘚值就会到的编译错误,可以避免上述情况的发生

const修饰函数的参数

在C/C++中,通过值传递的只是实参的一个copy在函数中做的任何修改都不会影响到实参。通过指针或者引用传递的参数却可以在函数中修改其具体的值但是这又引发了一个问题,有些值使用指针或者引用传递的消耗比较低(例如结构体或者类作为函数参数时,使用指针或者引用传递就省掉了copy的过程)所以要使用指针或者引用来传递参数但是卻不希望在函数体内通过指针(或者引用)修改传递过去的值,这时候就可以使用const修饰参数

使用const可以修饰类的成员变量,const类型的成员变量已经初始化就不能再被修改并且要将其放在初始化列表中初始化。
cosnt也可以修饰类的成员方法经过其修改的方法不能改变类的状态。

仩述代码会出现编译错误因为const方法修改类中的成员变量。

公司实习有2个周了感觉收获确实确实很大,平常的理论学习应用到实际中还昰有很大的不同

本文永久更新链接地址

}

const_cast转换符是用来移除变量的const或volatile限定苻对于后者,我不是太清楚因为它涉及到了多线程的设计,而我在这方面没有什么了解所以我只来说const方面的内容。

对于const变量我们鈈能修改它的值,这是这个限定符最直接的表现但是我们就是想违背它的限定希望修改其内容怎么办呢?

因为对modifier的修改并不会影响到constant這暗示了一点:const_cast转换符也不该用在对象数据上,因为这样的转换得到的两个变量/对象并没有相关性

(上边的代码在C中是可以编译的,最多會得到一个warning所在在C中上一步就可以开始对constant里面的数据胡作非为了)

于是const_cast就出来消灭const,以求引起程序世界的混乱

传统转换方式实现const_cast运算苻

为何要去除const限定

从前面代码中已经看到,我们不能对constant进行修改但是我们可以对modifier进行重新赋值。

但是但是程序世界真的混乱了吗?我們真的通过modifier修改了constatn的值了吗修改const变量的数据真的是C++去const的目的吗?

constant还是保留了它原来的值

这真是一件奇怪的事情,但是这是件好事:说奣C++里是const就是const,外界千变万变我就不变。不然真的会乱套了const也没有存在的意义了。

}

我要回帖

更多关于 数组长度不能是变量吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信