常数据成员:const 数据类型 数据成员名
1.定义常量必须初始化,对于类对象的const数据成员而且只能在类的构造函数的成员初始化列表中进行,另外,如果类中包含了引用型的数据成员 或者 其他类类型的数据成员,其初始化工作也必须在构造函数的初始化列表中完成,普通数据成员既可以在初始化列表中完成也可以在类的构造函数的体内完成;数据成员在初始化列表中的初始化顺序与在类中声明的顺序有关,而与初始化列表的书序无关;
注:静态数据成员(包括static const 数据成员)必须在类外初始化;
注:由于常数据成员和静态的数据成员必须进行初始化,所以不能用默认的构造函数;
常成员函数:返回值类型 成员函数名 (参数列表)const;
使用规则:
1、常成员函数只能使用成员数据而不能修改成员数据;
2、常成员函数只能调用const成员函数,不能调用非const成员函数;任何数据成员可以被使用;
3、非const成员函数既能调用const成员函数,也可以调用非const成员函数;
4、const对象只能调用public const成员函数,不能调用非const成员函数;
以下是测试代码:
#include<iostream>
using namespace std;
class A
{
public:
A(int i):a(i),b(a),c1(a){}
void f1()
{
a =5;
f2();//调用const成员函数
}
void f2()const
{
cout<<a <<b <<c1 << c2<<endl;
}
private:
int a;
int& b;
const int c1;
static const int c2;
};
const int A::c2 = 8;
int main()
{
const A obj1(2);//建立const A类型的对象obj1;
obj1.f2();//只能调用const成员函数;
A obj2(2);//建立A类对象obj2;
obj2.f2();//调用const成员函数;
obj2.f1();//调用非const成员函数;
return 0;
}
//输出结果是2228\
2228\
5528
//解释:输出结果第三个为什么b的值是5?
因为b被声明为int&,在初始的时候使用a初始的,所以b就是a的一个别名,当a修改为5它自然也是5