C++下的const:const修饰变量、const修饰的迭代器和const修饰函数学习讲解
程序员文章站
2022-05-15 21:06:00
const指定一个语意约束,编译器会强制实施这个约束,告诉编译器和程序员某值应该保持不变。
1、const修饰变量
const可以修饰在class外部的global或namespace作用域中的常量...
const指定一个语意约束,编译器会强制实施这个约束,告诉编译器和程序员某值应该保持不变。
1、const修饰变量
const可以修饰在class外部的global或namespace作用域中的常量;可以修饰文件、函数、区块作用域中声明为static的对象;也可以修饰class内部的static和non-static成员变量。
还可以修饰指针或指针所指物,根据const位置的不同,修饰的也不同(判断的诀窍是:const出现在*的左端还是右端,左端修饰指针所指物,右端修饰指针本身):
char[] greeting = "hello"; char* p = greeting; //下面的两行,指针所指物是const,而指针本身是non-const const char* p = greeting; char const * p = greeting; //指针所指物是const,而指针本身是non-const char* const p = greeting; //下面两行指针所指物是const,指针也是const const char* const p = greeting; char const * const p = greeting;
2、const修饰的迭代器
stl的迭代器是根据指针来实现的,所以迭代器的作用像一个t*的指针。
1、当声明迭代器用const 修饰时:表示这个迭代器不得指向其他的东西,但是所指东西的值是可以改变的。
2、当迭代器由const_iterator来定义时:表示这个迭代器所指东西的值是不可以改变的。
3、当声明迭代器用const 修饰并由const_iterator来定义时:表示这个迭代器所指东西的值是不可以改变的。
例子如下:
std::vector<int> vec; //... //作用同 t * const const std::vector<int>::iterator iter = vec.begin(); *iter = 10; //正确!可以改变所指物 ++iter; //错误!iter是const //作用同 const t * 或者 t const * std::vector<int>::const_iterator citer = vec.begin(); *citer = 10; //错误!*citer是const ++citer; //正确!可以改变指针 const std::vector<int>::const_iterator cciter = vec.begin(); *cciter = 10; //错误!*cciter是const ++cciter; //错误!cciter是const
3、const修饰函数
class rational { /*---*/}; const rational operator* (const rational& lhs, const rational& rhs);
上面这个乘积操作符重载为什么函数的返回值用const修饰?
原因:类似与下面的操作, a*b的结果不能被修改,不能作为左值,但在程序员的编码过程中有可能会出现不小心的错误,这样做可以防止无意的赋值操作。
rational a, b, c; //--- (a * b) = c; if(a * b = c);