const 作为C/C++中常见的关键字对于大多数初入编程的人来说既陌生又熟悉。我们很多时候仅仅只是清楚其作用,在实际编程中较少留意其使用。那么今天我和大家一起探讨一下到底如何正确的使用const。
const 修饰的类型主要包括:常量,函数或块作用域中的对象
例如:
- const 修饰的常量
const doublePI=3.1415926; 常量
- const 修饰的函数
class Person
{
……..
public :
void showInfomation(IntPersonID) const; 修饰函数的const,表示此函数不可以修改person类中的任何成员变量。
Prvate:
string m_name;
int m_age;
int m_address;
}
- const 修饰的函数块中或者类中的对象或者量
void InputDataToMemory(Vector<personClase> & persons)
{
.............
for(int i=0;i<persons.size(i);i++)
{.
........
const personClase signalPerson=persons.at(i); const 修饰函数或块作用域中的对象,表示接下来的代码中不可以对signalPerson中的任何变量修改;
..................
}
}
为什么要用const:
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">例如有一个函数,只是想读取形参变量中的数据,不需要甚至不允许修改其值,这时只要在形参前面,将传进来的数据加上const 修饰,这样函数体中<span style="font-family: Arial, Helvetica, sans-serif;">任何</span><span style="font-family: Arial, Helvetica, sans-serif;">对变量值的修改操作都会被编译器提醒非法:</span></span>
如:
void GetTextLen(const vector<string> &strVec)
{
......
}
通过引用传进来的strVec并不希望其中的任何元素在GetTextLen函数中被修改,因此在传进来的形参前加上const 确保了数据的安全性。这也告诉我们在写函数的时候,对函数中的形参需要更多的思考,在设计之初就应该依据变量的值是否应该在函数中被修改,设计为const 型和非const 型。对于只是读取或者参考变量中的数据的形参建议要将其申明为const 类型,这样编译文件时编译器会为我们对用const修饰过的变量做修改检查,能够最大限度地保证数据安全。
对于某一个在程序中不会改变的量,我们可以将其申明为常量,例如const double PI=31.415926,自然对数const double E=2.71828,这样的申明方法能够保证这些常用的数据在程序中不被修改,且其定义方式好过利用宏定义的常量类型。
指针常量和常量指针
在实际应用中还有一个十分让人混淆的概念,常量指针和指针常量,对这两者的区别说明如下:
常量指针是指数值是常的指针,本质是一个指针,只是其指向的量不可以改变其数值,如:
int a=9;
const *int p=&a;///读法很简单,就是读const 和*,读法按照它们排列的先后顺序就好。
*p=10;///非法操作,试图修改指针所指常量的值
指针常量是指指针自身是一个常量,本质是指针,只是指针的值不可以重新赋予,如:
int a=9;
int b=4;
int *const p=&a;///读法很简单,就是读const 和*,读法按照它们排列的先后顺序就好。
p=&b;;///非法操作,试图修改指针的值
Marks:
- 尽量的使用const来修饰程序中不希望被更改的数据。
- const 修饰符可以在任何作用域内的变量,函数形参,函数返回值,代码块中。