C++
函数后加
const
的意义
一些成员函数改变对象,一些成员函数不改变对象。
例如:
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.M
ember(10);
//
正确
但构造函数和析构函数对这个规则例外,它们从不定义为
常量成员,但可被常量对象调用(被自动调用)。它们也能给常量的数据成员赋
值,除非数据成员本身是常量。
为什么需要
const
成员函数?
我们定义的类的成员函数中,常常有一些成员函
数不改变类的数据成员,也就是说,这些函数是
"
只读
"
函数,而有一些函数要修
改类数据成员的值。如果把不改变数据成员的函数都加上
const
关键字进行标
识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成
c
onst
的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。
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
放在函数声明前呢?
因为这样做意味着函数的返回值是常量,意义完全不同。