在《C++编程思想》中有提到到:const在C和C++中使用有所不同,因此在网上搜到一些资料:
const变量是编译时常量,因此可以像define一样使用,并且可以作为数组的长度等编译时的常量,const变量定义的时候必须初始化,它可以在头文件中定义,在包含头文件的不同cpp文件中使用而不会引发命名冲突。
const对象:在该对象生命周期内,必须保证其任何成员变量没有被改变。const对象只能调用const成员函数。
一、C中的const
C中的const总体而言功能比较单一,也较容易理解:
1、作用:被const修改的内容不可修改。
2、使用场景:修饰变量、函数参数、函数返回值等。
3、特点:C中的const是运行时的const(与编译不同),因此不能取代#define,也不能作为数组的长度等需要编译时知道的常量。因为是运行时的const,所以可以只定义变量而不初始化(如:const int i;被当做是声明),另外在C中const变量是外部连接的,因此连接时如果在其他编译单元中有同名的const变量,会引发命名冲突,编译时会报错。
二、C++中的cosnt
1、非类成员的const
在C++中,const变量默认是内部连接的,因此在不同的编译单元中可以有同名的const变量的定义(因为也可以在头文件中定义const变量)。
const变量是编译时常量,因此可以像define一样使用,并且可以作为数组的长度等编译时的常量,const变量定义的时候必须初始化,它可以在头文件中定义,在包含头文件的不同cpp文件中使用而不会引发命名冲突。
编译器默认为不为const变量分配内存,除非使用extern说明,或者程序中有引用const变量的地址。
可以使用下面的类型转换(不安全),如:int* i = (int*)pConst或者int* = const_cast<int*>pConst (C++解const属性的const_cast)。
函数参数或返回值能使用const& 或者 const*时,尽量使用const属性,以增强程序健全性。
2、类中的const使用
类中的const与C语言中的一样,也只是运行时常量,不能作为数组长度使用,即不能取代#define。在类中可使用以下两种方式取代#define。(1) static const(必须在static const定义的地方对它进行初始化) ...(2)enum{...}//enum不占存储空间。
类中的const变量占存储空间
类中的const成员变量需要在构造函数初始化表中初始化。
#include <iostream> using namespace std; #define PE(X) cout<<#X <<" = "<<X<<endl; class Fred{ const int size;//const成员
static const count = 10;//static const 成员必须在其定义的地方进行初始化 public: Fred(int sz); void print(); }; Fred::Fred(int sz):size(sz){}//构造函数初始化表 void Fred::print(){ PE(size); } int main(){ Fred a(1),b(2),c(3); a.print(); b.print(); c.print(); return 0; }
const对象:在该对象生命周期内,必须保证其任何成员变量没有被改变。const对象只能调用const成员函数。
const成员函数:void fun() const...不仅能被const对象调用,也能被非const对象调用,因此,如果确认一个任何成员函数不改变任何成员变量,应该习惯性将该函数定义为const类型。 如果const成员函数需要改变成员变量,有两种实现方式:(1)const_cast<class*> this强制取消this指针的const属性。(2)将被改变的成员变量定义为mutable//应该只永远使用第二种方法,让任何阅读程序的人都知道该变量可能被const函数改变。
如果一个对象被定义成const,那么该const对象“可能”会被放入ROM当中,这在嵌入式开发当中有时非常重要....(不能有任何自定义的constructor和destructor,它的基类或者成员对象不能有任何自定义的constructor和destructor,不能有任何mutable成员变量)