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的值,因此将在编译的时候引发异常,这大大提高了程序的健壮性。

猜你喜欢

转载自www.cnblogs.com/pikapk/p/11521525.html