一些成员函数改变对象,一些成员函数不改变对象。
例如: 
int Point::GetY()
{
 return
yVal;

  这个函数被调用时,不改变Point对象,而下面的函数改变Point对象: 
void Point:: SetPt (int x, int y)
{
 xVal=x;
 yVal=y;

  

为了使成员函数的意义更加清楚,我们可在不改变对象的成员函数的函数原型中加上const说明: 
  class Point


 public:
  int
GetX() const;
  int
GetY() const;
  void
SetPt (int, int);
  void
OffsetPt (int, int);
 private:
  int
xVal, yVal;
};

  const成员函数应该在函数原型说明和函数定义中都增加const限定: 
    int Point::GetY() const


{
 return
yVal;
}
class Set {
public:
 Set
(void){ card = 0; }
 bool
Member(const int) const;
 void
AddElem(const int);
 //...
};
bool Set::Member (const int elem) const
{
 //...
}

  非常量成员函数不能被常量成员对象调用,因为它可能企图修改常量的数据成员: 
  const
Set s;
  s.AddElem(10);
// 非法:
AddElem不是常量成员函数
  s.Member(10);
// 正确 
  但构造函数和析构函数对这个规则例外,它们从不定义为常量成员,但可被常量对象调用(被自动调用)。它们也能给常量的数据成员赋值,除非数据成员本身是常量。 
为什么需要const成员函数?
  我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。 
const成员函数和const对象
  实际上,const成员函数还有另外一项作用,即常量对象相关。对于内置的数据类型,我们可以定义它们的常量,用户自定义的类也一样,可以定义它们的常量对象。例如,定义一个整型常量的方法为: 
  const
int i=1 ;
同样,也可以定义常量对象,假定有一个类classA,定义该类的常量对象的方法为:
  const
classA a(2);
  这里,a是类classA的一个const对象,"2"传给它的构造函数参数。const对象的数据成员在对象寿命期内不能改变。但是,如何保证该类的数据成员不被改变呢?
  为了确保const对象的数据成员不会被改变,在C++中,const对象只能调用const成员函数。如果一个成员函数实际上没有对数据成员作任何形式的修改,但是它没有被const关键字限定的,也不能被常量对象调用。下面通过一个例子来说明这个问题: 
    class C


{
 int
X;
public:
 int
GetX()
 {
  return
X;
 }
 void
SetX(int X) 
 {
  this->X
= X;
 }
}; 
void main()
{
 const
C constC;
 cout<<constC.GetX();
}

  如果我们编译上面的程序代码,编译器会出现错误提示:constC是个常量对象,它只能调用const成员函数。虽然GetX( )函数实际上并没有改变数据成员X,由于没有const关键字限定,所以仍旧不能被constC对象调用。如果我们将上述加粗的代码:
  int
GetX()
改写成:
  int
GetX()const
再重新编译,就没有问题了。
const成员函数的使用
  const成员函数表示该成员函数只能读类数据成员,而不能修改类成员数据。定义const成员函数时,把const关键字放在函数的参数表和函数体之间。有人可能会问:为什么不将const放在函数声明前呢?因为这样做意味着函数的返回值是常量,意义完全不同。下面是定义const成员函数的一个实例:
  class
X
  {
   int
i;
   public:
   int
f() const;
  }; 
  关键字const必须用同样的方式重复出现在函数实现里,否则编译器会把它看成一个不同的函数:
  int
X::f() const 
  {
   return
i;
  } 
  如果f(
)试图用任何方式改变i或调用另一个非const成员函数,编译器将给出错误信息。任何不修改成员数据的函数都应该声明为const函数,这样有助于提高程序的可读性和可靠性。

对象.成员函数

对象          成员函数      
对/错
1、  const        
const           对
2、  const        
non-const       错
3、  non-const    
const           对
4、  not-const    
non-const       对

成员函数调用成员函数

成员函数      成员函数      
对/错
5、  const        
const           对
6、  const        
non-const       错
7、  non-const    
const           对
8、  non-const    
non-const       对

C++ Const成员函数的更多相关文章

  1. const成员函数

    尽管函数名和参数列表都相同,void foo( ) const成员函数是可以与void foo( )并存的,可以形成重载! 我们假设调用语句为obj.foo(),如果obj为non-const对象,则 ...

  2. c++ 学习之const专题之const成员函数

    一些成员函数改变对象,一些成员函数不改变对象. 例如: int Point::GetY() { return yVal; } 这个函数被调用时,不改变Point对象,而下面的函数改变Point对象: ...

  3. 关于 const 成员函数

    成员函数如果是const意味着什么? 有两个流行概念:物理常量性和逻辑常量性. C++对常量性的定义采用的是物理常量性概念,即const 成员函数不可以更改对象内任何non-static成员变量.例如 ...

  4. C++类的const成员函数、默认的构造函数、复制形参调用函数(转)

    C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...

  5. c++中的const参数,const变量,const指针,const对象,以及const成员函数

    const 是constant 的缩写,“恒定不变”的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:“Use const whe ...

  6. 拷贝构造函数和const成员函数

    实验原因 说明如何使用const描述保护类数据不会意外修改. 编译环境 vc6sp6 + win7x64 工程下载 copyConstruction_constMemberFunction.zip   ...

  7. 12.C++-构造函数与析构函数调用顺序,const成员函数,const对象

    单个对象创建时,构造函数的调用顺序 1.首先判断该对象的类是否拥有父类,若有则先调用父类的构造函数 2.判断该对象的成员是否是其它类的成员,若是则调用成员变量的构造函数(调用顺序和声明顺序相同) 3. ...

  8. const 成员函数

    我们知道,在成员函数中,如果没有修改成员变量,应该给成员函数加上 const 修饰符,例如 #include <iostream> using namespace std; class F ...

  9. Item 16: 让const成员函数做到线程安全

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果我们在数学领域里工作,我们可能会发现用一个类来表示多项式会很方 ...

随机推荐

  1. WinDebug 常用命令表【摘】

    启动, 附加进程, 执行和退出(Starting, Attaching, Executing and Exiting) ======================= Start -> All ...

  2. Unity脚本获取内存和FPS

    using System; using System.Collections.Generic; using UnityEngine; public class Debugger : MonoBehav ...

  3. 《简明python教程》学习笔记,长文

    引号: 单引号:如果包含的字符串里有单引号的话,需要在那个单引号里加转义符号,或者使用双引号 例:print 'he"llo' or print 'he\'llo'    ===> h ...

  4. DC DC電路電感的選擇

    注:只有充分理解電感在DC/DC電路中發揮的作用,才能更優的設計DC/DC電路.本文還包括對同步DC/DC及異步DC/DC概念的解釋.   DCDC電路電感的選擇 簡介 在開關電源的設計中電感的設計為 ...

  5. Android 手机上安装并运行 Ubuntu 12.04(转,没实测)

    设备需要root权限,并且安装了BusyBox最小 1GHz 处理器(推荐)Android 系统版本 2.1 或以上Android 设备需要自定义的ROM固件SD卡至2.5GB (安装大映像的需要3. ...

  6. 199bit总结的影响最大的十个算法

    1. 归并排序(MERGE SORT).快速排序(QUICK SORT)和堆积排序(HEAP SORT) 哪个排序算法效率最高?这要看情况.这也就是我把3种算法放在一起讲的原因,可能你更常用其中一种, ...

  7. 【转】linux 原子整数操作详解

    原文网址:http://blog.csdn.net/hunanchenxingyu/article/details/8994379 printk(“%d\n”,atomic_read(&v)) ...

  8. PermGen space 与 Java heap space

    1.java.lang.OutOfMemoryError: PermGen spacePermGen space的全称是Permanent Generation space,是指内存的永久保存区域Ou ...

  9. foreach as 和 in_array

    1.$arr = array("one", "two", "three"); foreach ($arr as $value) { echo ...

  10. 注释PHP和html混合代码

    <?php if(false){ ?> any code <?php } ?>