常对象成员包括常成员函数和常数据成员。
1. 常成员函数
使用const关键字声明的函数为常成员函数,常成员函数声明格式如下:
类型 函数名(参数表) const ;
对于常对象成员需要注意以下几点:
(1) const是函数类型的一个组成部分,因此在实现部分也要带const关键词。
(2) 常成员函数不更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数
(3) 如果将一个对象声明为常对象,则通过该常对象只能调用它的常成员函数,而不能调用其他成员函数。
(4) const关键字可以参与区分重载函数。例如,如果在类中有如下声明,则这是对print的有效重载。
void print() ;
void print() const ;
例:如下代码
#include <iostream>
using namespace std ;
class Sample
{
int n ;
public :
Sample(int i) { n = i ;}
void print() {cout << "1: n = " << n << endl ;}
void print() const {cout << "2: n = " << n << endl ;}
} ;
void main()
{
Sample a(10) ;
const Sample b(20) ;
a.print() ;
b.print() ;
}
输出如下:
2. 常数据成员
就像一般数据一样,类的成员数据也可以是常量和常引用,使用const声明的数据成员为常数据成员。如果在一个类中声明了n个常数据成员,那么构造函数就只能通过初始化列表对该数据成员进行初始化,其一般格式如下:
构造函数(参数表):常数据成员1(参数1),常数据成员2(参数2),···,常数据成员n(参数n)
其中,冒号后面是一个数据成员初始化列表,它包含一个初始化项,当有多个初始化项时,要用逗号分隔开。“参数1”~“参数n”均为“参数表”中的某个参数。这样,在执行构造函数时自动将“常数据成员1”赋值为“参数1”的值,“常数据成员2”赋值为“参数2”的值,“常数据成员n”赋值为“参数n”的值等。
例:如下代码
#include <iostream>
using namespace std ;
class Sample
{
const int n, m ;
public :
Sample(int i, int j) : n(i), m(j) {}
void print() {cout << "n = " << n << ", m = " << m << endl ;}
} ;
void main()
{
Sample a(10, 20) ;
a.print() ;
}
输出如下: