const的本意是为了替代#define,它和define比较,它有类型检查,define没有,而且常量折叠也是const特有的。通过使用const我们可以消除一些隐藏的错误,并且有作用域,define只是简单的文字替换功能。C++ 中的const可用于指针、函数、返回类型、类等。
头文件中的const,没有内存分配产生,除非有extern来修饰它,extern有个特点有注意:它只能初始化一次,并且初始化位置和全局变量的位置一样,用extern会导致内存分配。
const在C中是默认的链接属性是外部链接,C++则是内部链接;C中cosnt必须有内存空间,C++则没有分配内存。在C中,这样写是错误的:const int size = 34;char buf[size]。因为size在编译期间是编译器无法获取它的值。在C中只能这样写,const int size;这表示一个const常量的声明。
const和指针,要么修饰指向的对象,要么指针(地址)。可以把一个非const对象地址赋给一个const指针,反之则不行。
const和函数:可用在函数参数和返回值中,在返回值中,如果按值返回一个内置数据类型(int、float)等没意义,因为返回仅仅是一个值而非变量,但是用户自定义类型就不同了(类和结构体)。我们提倡在形参中尽可能使用const,原因是const的参数可以接受const和非const两中类型的参数,因为函数传参,在值传递下本事就是赋值关系。单数如果是引用传值,则不同,如果要把一个临时变量传递给函数,必须定义为const。
在类(class)中的const,const方法只能为const对象所调用,const成员的初始化一般在成员初始化列表中(在构造函数的参数表和冒号后),这里告诉人们,表里的初始化发生在执行构造函数的任何代码前。如:Class Fr{const int size;public:Fr(int sz);};
Fr::Fr(int sz):size(sz){};//初始化成员列表。static const必须在定义的时候初始化,它意味着一个编译器的常量,仅对内部数据成员而言。const方法在定义时const不可省略,声明一个const成员方法,必须把const放到函数参数表的后面。const成员方法调用const和非const对象是安全的,不修改任何数据成员的方法都应该声明为const。注意:构造和析构函数不能是const。
mutable和voatile的区别:
mutable一般用在强制转换const(它实质是转换this指针,但在const成员函数中,this指针实际是一个const指针,所以还应把它强制转换成一个普通指针),用mutable修饰一个成员变量表示它可以在const对象里被改变。
voatlie告诉编译器,对数据不用优化,它的意思是说,在某种编译器不认知的范围内,这个数据可以被改变。
如果想要让一个对象是只读的,除了用const修饰对象外,在对象中不能使用mutable,并且类或结构体没有构造和析构,没有基类。
按位const指对象内部是不变的,按逻辑const指概念上是不变的它的成员可以改变(在强制类型转换后)。const的转换用const_cast.