程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 簡介C++中的const

簡介C++中的const

編輯:關於C++

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

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

我們可以從右向左把上述定義語句讀作“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 對象”。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved