C++中const的应用
const常量相对与宏常量优势:
const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。
常见的const用法:
常变量: const 类型说明符 变量名
常数组: const 类型说明符 数组名[大小]
常指针: const 类型说明符* 指针名 ,类型说明符* const 指针名
常引用: const 类型说明符 &引用名
常对象: const 类名 对象名
常量成员函数: 类名::fun(形参) const
常变量:
取代了C中的宏定义,声明时必须进行初始化。
const int a=10;
常数组:
const int a[3]={1,2,3};//定义一个常数组,则不能通过a[0]=0形式对数组元素赋值
但通过const声明的常量变量只能保证不通过变量名修改变量的值,但可以通过其他方式修改变量所在内存的内容,比如指针。
int main(){
const int a[3] = { 1,2,3 };
int* p;
p = (int*)a;
*p = 0;
cout << a[0] << endl;//此时a[0]输出为0
}
常指针的两种含义:
使用指针时涉及到两个对象:该指针本身和被它所指的对象。
①char *const p; //p为指针常量,即指针为常量不能改变,指针指向的内容可改变
void func(int* const p){
int *pi = new int(100);
p = pi;//错误!P是指针常量。不能对它赋值。
}
int main()
{
int* p = new int(10);
func(p);
delete p;
return 0;
}
②char const *p1; //p1为常量指针,即指针指向内容为常量不可改变,指针可改变
void func(int const *p)
{
*p = 8;//错误!*P是常量,不能对它进行改变。
}
int main()
{
int* p = new int(10);
func(p);
delete p;
return 0;
}
常量与引用:
void func(const int& i)
{
i = 100; // 错误,不能通过该引用改变对应内存的内容
}
int main()
{
int i = 10;
func(i);
return 0;
}
如果不希望函数的调用者改变参数的值,应该使用引用。
常量成员函数:
常量函数是C++对常量的一个扩展,它很好的确保了C++中类的封装性。在C++中,为了防止类的数据成员被非法访问,将类的成员函数分成了两类,一类是常量成员函数(也被称为观察者);另一类是非常量成员函数(也被成为变异者)。在一个函数的签名后面加上关键字const后该函数就成了常量函数。对于常量函数,最关键的不同是__编译器不允许其修改类的数据成员__。例如:
class Test
{
public:
void func() const;
private:
int intValue;
};
void Test::func() const
{
intValue = 100;//错误,不能修改类的数据成员
}
上面的代码中,常量函数func函数内试图去改变数据成员intValue的值,因此将在编译的时候引发异常,这大大提高了程序的健壮性。