C++中的const成员函数

数据成员的值反应了对象在程序运行某个时刻的状态。数据成员值的改变是由于对象处理了一条消息,往往是某个成员函数被调用。但是有的时候我们希望,成员函数仅仅是访问数据成员而不对其值进行修改。所以,对象的成员函数被分成了两类:

1. 修改对象状态的成员函数;

2. 获取对象状态的成员函数;

而const 成员函数就是为第2个功能而设计。尽管,只要我们在成员函数里不修改对象数据成员的值就可以认为这是一个获取对象状态

的成员函数,但是有的时候在实现的时候会无意的改变数据成员的值,所以为了起到防范的目的,C++提供了const 成员函数的机制,

即在定义一个成员函数时,给他加上const 说明,表示他是一个获取对象状态的成员函数。

定义的方式是:

在 函数名之后和函数体之前加上 const 关键词,例如下面类A中的函数 func

class A
{
    ...................
     void func() const { ... }
};

此时成员函数func被定义成为了const 成员函数,在函数体中不能修改数据成员的值,如果在func中改变了这些值那么编译程序就会指出这个错误,例如下面的实现

class A
{
  int data;
  char *p;
  public:
  .............
  void func() const
  {
    data = 10;     // Error, 表达式必须是可修改的左值
    p = new char[10];  // Error
  }
};

但是,对于指针类型的变量,虽然不允许const成员函数修改指针本身,但是允许它修改指针所指向的值,如上面的func函数如果修改成以下所示:

class A
{
  int data;
  char *p;
  public:
       .....................
  void func() const
  {
    *p  = 'A';   // 改变的是p指向的值,但是没有改变p自身,所以编译通过
    strcpy(p, "abcde");   // 同上
  }
};

所以,在这种情况下,仍需要程序设计者自己对程序进行把握。

上面就是 const 成员函数的主要用法,下面我们来介绍它的另一个用法:

对常量对象的成员函数的合法性进行判断。

例如下面的例子:

class A
{
  int x,y;
  public:
    void f() const {...}
    void g() {...}
};
const A a;
............
a.f();  //ok 常量对象调用常量成员函数
a.g();  // Error. 

a是常量对象,所以对常量对象的操作只能获取对象的状态,而不能改变它的状态。所以只能调用a的const 成员函数。

常量对象一般用于函数的形参类型说明,同时为了提高参数传递的效率,一般是将形参定义为对象指针或者引用,这时为了防止函数修改实参对象

可以把形参定义为常量对象指针或者常量对象引用,例如:

void f(const A *pa); 或者 void f(const A &a);

这样在函数f中就不能调用对象*pa或a的非const 成员函数;从而起到保护作用。

还有一点需要注意的是,如果将const 成员函数放在类外定义,那么函数声明和定义的地方都要加上const

class A
{
    void f() const; //声明
};
void A::f()const
{
     // 定义
}
时间: 2024-11-05 19:26:29

C++中的const成员函数的相关文章

mutable用于修改const成员函数中的成员变量

http://no001.blog.51cto.com/1142339/389840/ mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中. 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的.但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,

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

const 是constant 的缩写,“恒定不变”的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:“Use const whenever you need”. 1.用const 修饰函数的参数 如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修饰,否则该参数将失去输出功能.const 只能修饰输入参数: 如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地

C++中const对象和const成员函数

1?  成员函数可以声明成const函数(声明后加const) 2?  对于const对象,只能调用const成员函数 3?  Const函数和非const函数可以形成重载 4?  对于非const对象的函数调用优先选择非const成员函数 5?  对于类中的mutable数据成员,可以被const成员函数修改 // // main.cpp // Const // // Created by 06 on 15/1/24. // Copyright (c) 2015年 黄永锐. All right

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

实验原因 说明如何使用const描述保护类数据不会意外修改. 编译环境 vc6sp6 + win7x64 工程下载 copyConstruction_constMemberFunction.zip 使用非const成员函数,引起的拷贝构造函数报错 [cpp] view plain copy class CStudent { /// 常量定义 public: enum {NAME_SIZE_MAX = 64}; /// 构造, 拷贝构造, 析构函数 public: CStudent(); CStu

C++类const成员函数

c++类中可以用const关键字来声明不修改对象的成员函数,它使用时需要注意: 1.常量对象只能调用const成员函数 2.非常量对象可以调用const成员函数 以下列代码为例,来解释: 1 class Person{ 2 public: 3 void print(){ 4 cout<<"I am a common function!"<<endl; 5 } 6 void show()const{ 7 cout<<"I am a const

C/C++中的常成员函数

代码: 1 #include <iostream> 2 3 using namespace std; 4 5 class A{ 6 public: 7 void func1(){ 8 cout<<"func1"<<endl; 9 } 10 void func1()const{ 11 cout<<"const func1"<<endl; 12 } 13 void func2()const{ 14 cout&l

(转)函数后面加const--C++ const成员函数

类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变. 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const.所以 const 关键字对成员函数的行为作了更加明确的限定:有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员:没有 const 修饰的成员函数,对数据成员则是可读可写的.

关于 const 成员函数

成员函数如果是const意味着什么? 有两个流行概念:物理常量性和逻辑常量性. C++对常量性的定义采用的是物理常量性概念,即const 成员函数不可以更改对象内任何non-static成员变量.例如: 1 class CTextBlock 2 { 3 public: 4 ...... 5 std::size_t length() const; 6 7 private: 8 char* pText; 9 std::size_t textLength; 10 bool lengthIsValid;

C++中string的成员函数

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86