现在的位置: 首页 > 综合 > 正文

C和C++中const的不同之处

2013年11月19日 ⁄ 综合 ⁄ 共 1721字 ⁄ 字号 评论关闭
在《C++编程思想》中有提到到:const在C和C++中使用有所不同,因此在网上搜到一些资料:

一、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成员变量)
       

抱歉!评论已关闭.