C++编程思想学习——常量

来源:互联网 发布:第三方qq软件 编辑:程序博客网 时间:2024/04/25 12:41

1、常量的基本概念

      常量是用来表示在程序运行中不会改变的量。常量的作用域和普通变量的作用域是相同的。

常量可以用做值替换。

常量也可以用来存储在程序运行期间产生的值,但是,该值在整个生命周期内是不会改变的,这样如果有在运行期间试图改变它则会给出错误信息,从而提高了程序的安全性。

同时,常量也可以用于集合,用于描述一个不会改变的存储块。但是,编译器不会将整个集合保存到符号表中,所以,必须为常量集合分配存储空间。由于,编译器在编译阶段并不需要存储的内容,所以,不能在编译期间使用集合各元素的值。

详细的使用方法以及技巧,请查阅前面的C++中的C特征一章中的常量。

2、赋值及类型检查

      可以将一个非const的对象地址赋值给一个指向常量的指针,因为有时不想改变某些可以改变的东西,如:在给函数传递一个地址时,但是又不想函数改变本地址中的数据,此时,函数参数可以设置为指向常量的指针。但是,不能将一个常量对象的地址赋值给一个指针变量(除非,用不明智的强制类型转换)。但是,传递一个const值,不如在函数内部用const限定参数。限定时可以用指针来实现但是,更好的是使用引用。如:为了在函数中不改变I的值,可以用 const int & c=I;这样在函数中I 的值是不会被改变的。

      返回const值:如果,返回值是一个内部数据类型的数据,则const无意义。但如果,返回值是一个用户自定义的对象时,返回值为const类型,则说明返回的对象不能被改变,不能作为表达式的左值。

      临时变量:再求表达式只是编译器必须创建临时对象,由编译器决定他们的产生、消亡。而客户程序通常接触不到临时变量,改变临时变量时错误的,这些信息是不可靠的,一旦表达式被计算出,临时对象也就被编译器销毁了。所以,编译器是所有临时对象自动地成为const,这样当程序员范修改临时对象的错误时,编译便会报错。

3、类与const

构造函数是有返回值的,返回的就是新构造的对象本身。常表达式经常用于类中的一个应用就是,用于在类中定义一个成员数组,用常量表达式来指定数组的大小。使得每个类的对象都有一个指定大小的数组。由于const在类中,所以,这是一个内部连接,所以,不会与别的类或者文件域冲突。而,这一功能是define所不能达到的,define为全局的作用域。但是,如果把一个const放到类里又达不到这样的效果,Const又部分的恢复到了它在C语言中的含义,因为它在每个对象里分配了存储空间。由于const常量的定义与初始化是要在一起的,并且一旦被初始化,在对象的整个生命周期就不会再被改变。所以,要把给const赋初值放在构造函数一个特殊的地方,那就是在构造函数主体开头花括号前的“函数调用列表”,用于,提醒人们在进行构造函数主题之前,const已经被初始化了。所以,不能改变了。

4、编译期间类的常量

       Static用于时类有一个编译期间的常量成员。关键字static意味着:不管类的对象常见多少次,都只有一个实例。类中的一个常量成员在该类的所有对象中都是一样的。必须在定义static const的地方进行初始化。但是旧版的C++不支持在类中给成员变量初始化。所以,有的编译通不过。这时候可以用enum来实现。

5const对象和成员函数

       Const对象用于保证所声明的对象的数据成员在它的声明周期里不会被改变。通过Const对象只能调用const的成员函数来确保该对象的私有成员变量不被改变。同样在const成员函数中也不能调用非const成员函数。同时,通过对象的成员变量不能做左值来确保成员变量不被改变。

      如果,非要改变常量对象中的数据成员时,可以用两种方法。方法一:将this指针强制转换为普通的对象指针。如:((class *)this)->i++;用以将常量的this指针转换为普通的对象指针。方法二:用关键字mutable在成员变量的定义中。将成员变量的常量的缺乏性隐藏在成员数的定义中。如:声明一个隐藏常量性的成员变量j,可用:mutable int j;

6volatile关键字

      用于告诉编译器此成员对象中的成员变量可以比编译器范围外改变。所以,在编译期间不要做优化。Volatile的对象的用法与const对象的相同,这里不再累赘。

      Const是非常好的类型检查形式及安全性。在所有可能的地方使用const往往为项目的救星。

   本文为个人学习C++编程思想时个人心得体会,所以,难免有不严谨之处,甚至有可能是错误的理解。如发现错误,或者疑问。欢迎提出讨论,共同学习、进步。

原创粉丝点击