简介C++中的const
当前位置:以往代写 > C/C++ 教程 >简介C++中的const
2019-06-13

简介C++中的const

简介C++中的const

副标题#e#

1、const 引用是指向 const 工具的引用:

const int ival = 1024;
const int &refVal = ival; // ok: both reference and object are const
int &ref2 = ival;  // error: non const reference to a const object

可以读取但不能修改 refVal。同理,用 ival 初始化 ref2 也是不正当的。ref2 是普通的非 const 引用,因此可以用来修改 ref2 指向的工具的值。通过 ref2 对 ival 赋值会导致修改 const 工具的值。为阻止这样的修改,需要划定将普通的引用绑定到 const 工具是不正当的。

const 引用可以初始化为差异范例的工具可能初始化为右值,如字面值常量:

int i = 42;
// legal for const references only
const int &r = 42;
const int &r2 = r + i;

同样的初始化对付非 const 引用却是不正当的,并且会导致编译时错误。

即:非 const 引用只能绑定到与该引用同范例的工具。而const 引用则可以绑定到差异但相关的范例的工具或绑定到右值。

2、每种容器范例界说了一种名为 const_iterator 的范例,该范例只能用于读取容器内元素,但不能改变其值。纵然用 const_iterator 范例时,我们可以获得一个迭代器,它自身的值可以改变,但不能用来改变其所指向的元素的值。可以对迭代器举办自增以及利用解引用操纵符来读取值,但不能对该元素赋值。

譬喻,假如text是vector<string> 范例,措施员想要遍历它,输出每个元素,可以这样编写措施:

// use const_iterator because we won't change the elements
for (vector<string>::const_iterator iter = text.begin();iter != text.end(); ++iter)
cout << *iter << endl; // print each element in text

除了是从迭代器读取元素值而不是对它举办赋值之外,这个轮回与普通轮回相似。由于这里只需要借助迭代器举办读,不需要写,这里把iter 界说为const_iterator 范例。当对const_iterator 范例解引用时,返回的是一个const 值。不答允用const_iterator举办赋值

for (vector<string>::const_iterator iter = text.begin();iter != text.end(); ++ iter)
*iter = " ";   // error: *iter is const

总而言之:利用const_iterator范例时,我们可以获得一个迭代器,它自身的值可以改变,但不能用来改变其所指向的元素的值。可以对迭代器举办自增以及利用解引用操纵符来读取值,但不能对该元素赋值。

3、不要把const_iterator工具与const的iterator工具夹杂起来。声明一个const迭代器时,必需初始化迭代器。一旦被初始化后,就不能改变它的值:

vector<int> nums(10); // nums is nonconst
const vector<int>::iterator cit = nums.begin();
*cit = 1;        // ok: cit can change its underlying element
++cit;         // error: can't change the value of cit
即:// an iterator that cannot write elements
vector<int>::const_iterator
// an iterator whose value cannot change
const vector<int>::iterator


#p#副标题#e#

4、指向 const 工具的指针

假如指针指向const工具,则不答允用指针来改变其所指的const值。为了担保这个特性C++语言强制要求指向const工具的指针也必需具有const特性:

const double *cptr; // cptr may point to a double that is const

这里的cptr是一个指向double范例const工具的指针,const限定了cptr指针所指向的工具范例,而并非cptr自己。也就是说,cptr自己并不是const。在界说时不需要对它举办初始化,假如需要的话,答允给 cptr从头赋值,使其指向另一个const工具。但不能通过cptr修改其所指工具的值:

*cptr = 42;  // error: *cptr might be const

把一个 const 工具的地点赋给一个普通的、非 const 工具的指针也会导致编译时的错误:

const double pi = 3.14;
double *ptr = &pi;    // error: ptr is a plain pointer
const double *cptr = &pi; // ok: cptr is a pointer to const

答允把非 const 工具的地点赋给指向 const 工具的指针,譬喻:

double dval = 3.14; // dval is a double; its value can be changed
cptr = &dval;    // ok: but can't change dval through cptr

尽量dval不是const工具,但任何诡计通过指针cptr修改其值的行为城市导致编译时的错误。cptr一经界说,就不答允修改其所指工具的值。假如该指针刚好指向非const工具时,同样必需遵循这个法则。

在实际的措施中,指向 const 的指针常用作函数的形参。将形参界说为指向 const 的指针,以此确保通报给函数的实际工具在函数中不因为形参而被修改。

5、const 指针

除指向 const 工具的指针外,C++ 语言还提供了 const 指针——自己的值不能修改:

int errNumb = 0;

int *const curErr = &errNumb; // curErr is a constant pointer

#p#分页标题#e#

我们可以从右向左把上述界说语句读作“curErr 是指向 int 型工具的 const 指针”。与其他 const 量一样,const 指针的值不能修改,这就意味着不能使 curErr 指向其他工具。任何诡计给 const 指针赋值的行为(纵然给 curErr 赋回同样的值)城市导致编译时的错误:

curErr = curErr; // error: curErr is const

与任何 const 量一样,const 指针也必需在界说时初始化。

指针自己是 const 的事实并没有说明是否能利用该指针修改它所指向工具的值。指针所指工具的值可否修改完全取决于该工具的范例。譬喻,curErr 指向一个普通的很是量 int 型工具 errNumb,则可利用 curErr 修改该工具的值:

if (*curErr) {
errorHandler();
*curErr = 0; // ok: reset value of the object to which curErr is bound
}

6、指向 const 工具的 const 指针

还可以如下界说指向 const 工具的 const 指针:

const double pi = 3.14159;
// pi_ptr is const and points to a const object
const double *const pi_ptr = &pi;

本例中,既不能修改 pi_ptr 所指向工具的值,也不答允修改该指针的指向(即 pi_ptr 中存放的地点值)。可从右向左阅读上述声明语句:“pi_ptr 首先是一个 const 指针,指向 double 范例的 const 工具”。

    关键字:

在线提交作业