欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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);