C++中const的基础介绍
来源:优易学  2011-11-22 10:50:24   【优易学:中国教育考试门户网】   资料下载   IT书店
  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 对象”。

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训