C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解

转载 2012年03月29日 09:52:26

转自http://blog.csdn.net/gmstart/article/details/7046140

在C++的类定义里面,可以看到类似下面的定义:

01 class List {
02 private:
03      Node * p_head;
04      int length;
05      ……
06 Public:
07      int GetLength () const;
08      bool GetNodeInfo(const int index,Node & buffer) const {…… }
09      bool DeleteNode(const int index);
10      …………
11 }

可以看到,在GetLength和GetNodeInfo两个成员函数的参数列表后面出现了一个const。这个const指明了这个函数不会修改该类的任何成员数据的值,称为常量成员函数。
对于const函数的外部定义,也不能忘记书写const限定符,如下面给出GetLength函数(指返回链表的长度)的定义:

1 int List::GetLength() const //这里依然不能忘记const
2 {
3      Return length;
4 }

如果在const成员函数的定义中出现了任何修改对象成员数据的现象,都会在编译时被检查出来,如:

1 int List::GetLength() const
2 {
3      Return length++; //错误!
4 }

const成员函数存在的意义在于它能被const常对象调用。我们都知道,在定义一个对象或者一个变量时,如果在类型前加一个const,如const int x;,则表示定义的量为一个常量,它的值不能被修改。但是创建的对象却可以调用成员函数,调用的成员函数很有可能改变对象的值,比如下面这段程序:

1 const List myList;
2 myList.DeleteNode(3); //错误,DeleteLength是非const成员函数

显然调用DeleteNode这个成员函数删除一个链表结点后,很有可能改变对象中length(链表长度)这个值,这不符合const对象的规定。但是,如果不允许const对象调用任何成员函数又是非常不合理的。于是,我们把那些肯定不会修改对象的各个属性值的成员函数加上const说明符,这样,在编译时,编译器将对这些const成员函数进行检查,如果确实没有修改对象值的行为,则检验通过。以后,如果一个const常对象调用这些const成员函数的时候,编译器将会允许。比如:

1 const List myList;
2 myList.GetLength(); //正确,GetLength是const常函数,它返回链表长度,的确没有改变
3 //属性值的行为,被检验通过

你可能会问,为什么不在一个const常对象调用成员函数的时候再进行检查呢?如果被调用的函数会改变对象的属性值,则立即打住就是了。这样就不用麻烦地在成员函数后面加const限定符了。然而,这无疑会大大增加编译时间。考虑下面这段代码:

1 const List MyList;
2 MyList.GetLength();
3 ……
4 MyList.GetLength();
5 ……

这段代码中,GetLength被调用了两次,但是编译时却也要检查两次,倘使一个成员函数被调用多次,那么他将在每次调用的时候都会被检查。这显然大大不利。而如果在定义类的时候加上const限定符对常函数加以标记,那么编译器只是检查一次就好,在const对象调用成员函数时,const函数将会被直接放行。所以,C++采取了const限定符描述常函数方案而摈弃了后者。所以,即使一个函数没有修改对象值的行为,如果没有加上const限定符说明是常函数,那么const对象依然不能调用它。
然而,有些时候,我们却必须要让const函数具有修改某个成员数据值的能力。比如一些内部的状态量,对外部用户无所谓,但是对整个对象的运行却大有用处,如支持缓存的技术。遇到这种问题,我们可以把一个成员数据定义为mutable(多变的),它表示这个成员变量可以被const成员函数修改却不违法。比如下面定义了一个is_valid类成员:

01 class List
02 {
03 private:
04      ……
05      mutable bool is_valid;
06      ……
07 public:
08       bool CheckList() const
09      {
10           if(length >= 1) then return is_valid =true;
11           else return is_valid = false//正确!
12       };

这样,即使像CheckList这样的const成员函数修改它也是合法的。
但需要注意的时,不可滥用mutabe描述符,如果在某个类中只有少数一部分是被允许const常量函数修改的,使用mutable是再合适不过的。如果大部分数据都定义为mutable,那么最好将这些需要修改的数据放入另一个独立的对象里,并间接地访问它。

参考资料:《C++ Programming Language 第三版》
注:本文属知无涯原创,转载请注明出处!

类中成员函数声明后面的const的含义!

这个const一般是对类中成员函数属性的声明,但这个声明怪怪的,只能放在函数声明的尾部,大概是因为其它地方都已经被占用了。这个声明表示任这个函数不会修改类中的数据成员。如果在编写const成员函数时,...
  • wenhao_ir
  • wenhao_ir
  • 2016年06月08日 12:13
  • 1625

C++ 类成员函数后面加 const关键字

这是用在类成员函数的声明和定义中, 例如 在 .h中    void fun()const; 在.cpp中    void Class::fun() const    {       ...
  • CNHK1225
  • CNHK1225
  • 2015年10月14日 10:12
  • 2441

C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解

在C++的类定义里面,可以看到类似下面的定义: 01 class List { 02 private: ...
  • williamzhang1111
  • williamzhang1111
  • 2015年06月23日 09:31
  • 356

C++关于类成员函数在参数列表后加const的作用,以及使用条件

C++关于类成员函数在参数列表后加const的作用,以及使用条件
  • u014452891
  • u014452891
  • 2017年07月25日 17:06
  • 406

C++学习之const成员函数(函数声明后加const,或称常量成员函数)用法详解

在C++的类定义里面,可以看到类似下面的定义: 01 class List { 02 private: ...
  • qq_26460507
  • qq_26460507
  • 2017年03月08日 00:51
  • 109

C++中const成员函数和非const成员函数的重载

函数重载 函数重载的定义是:在相同的作用域中,如果函数具有相同名字而仅仅是形参表不同,此时成为函数重载。注意函数重载不能基于不同的返回值类型进行重载。 注意函数重载中的“形参表”不同,是指本质不同...
  • bzhxuexi
  • bzhxuexi
  • 2015年02月02日 14:30
  • 2481

C++ 笔记_类的成员函数以及const的作用

类内部,声明成员函数是必须的,而定义成员函数则是可选的,在类内部定义的函数默认为inline。在类外部定义的成员函数必须指明他们是在类的作用域中,将关键字const添加到函数形参后面,就可以将成员函数...
  • wsr123wsrwsr
  • wsr123wsrwsr
  • 2016年11月02日 22:18
  • 359

C++ const型成员函数与 non-const型成员函数

首先一点,二者是可以构成重载的,仅根据返回值的 const/non-const 与否是无法构成重载的; 两者的区别和各自的调用时机...
  • lanchunhui
  • lanchunhui
  • 2016年02月22日 12:07
  • 462

用 const 限定类的成员函数

类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变。 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而...
  • whyglinux
  • whyglinux
  • 2006年02月18日 23:18
  • 13521

c/c++中const成员函数的返回值类型

const成员函数又称为访问函数,在const函数体内不能修改成员变量的值。 那么对于const函数的返回值呢? 结合网上内容,写了一个小的实验代码, class T{ public: struct...
  • u011567017
  • u011567017
  • 2017年01月05日 20:31
  • 649
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
举报原因:
原因补充:

(最多只允许输入30个字)