1、常对象
在定义对象是=时,我们可以将对象定义为
常对象。常对象中的数据成员为常变量且必须要有初值。例如:Person const p('M')。一旦声明可常对象那么常对象中的所有数据成员的值都不能被修改。所以希望保证数据成员的不被改变的对象,我们都可将其声明为常对象。
定义常对象的格式:类名 const 对象名(实参列表){}
或const 类名 对象名(实参列表){}
需要注意的是:一个对象一旦被声明为常对象,那么该对象就不能调用非const的成员函数(除了油系统自动调用的隐式的构造函数和析构函数)。
总之一旦使用关键字const修饰成员函数,成员对象,一般情况下我们是不可以对数据成员进行修改,但是在是实际编程中我们确实要修改里面的值,比如我们声明了一个用于计数的变量count,这个值是需要不断变化的,这时我们只需将要修改的数据成员声明时在其前添加一个关键字:mutable即可:
如mutable int count;这样声明其实是将count声明为可变的数据成员,这样我们就可以使用const的成员函数对其值进行修改。同时count也可以在构造函数中进行初始化。
常数据成员的声明与一般数据成员的=声明类似,而区别在在于在一般数据成员的声明前面加上以const关键字。常数据成员一旦声明并赋予初值,它的值是不能改变的。而且需要注意的是:常数据成员的智能通过构造函数的
参数
初始化列表对常数据成员进行初始化。
格式:const 数据类型 变量名;
下面的初始化是非法的在编译时是不会通过的:
const char name;
Person::Person(char n){name = b;}
其编译不会通过的原因是:因为常数据成员是不能被赋值的。
合法的初始化方式是:
const char name;
Person::Person(char n):name(n){}
3、常数据函数
常数据成员只能被常成员函数访问,但是常成员函数不能改变其值。
声明常成员函数格式:数据类型 函数名 const{ }
下面是声明常成员函数,并且使用常成员函数获取常数据成员:
char
GetName() const{return name;}
4、一个类中既有常数据成员又有非常数据成员
当一个类中既有常数据成员又有非常数据成员时,不可在构造在构造函数中同时对二者进行初始化。这时对两个数据成员进行赋值时有所区别,因为常数据成员不能被赋值,所以在声明常数据成员之后对其初始化应在构造函数的参数初始化列表里进行,而非长数据成员可以通过定义函数改变其值。
访问:在访问二者时,可以在常成员函数中访问也可以在非成员函数中访问;
合法的访问:
void getData()
//成员函数访问数据成员和常数据成员
{cout<<"name"<<name<<endl;
}
void getData()
const
//常成员函数访问常数据成员和数据成员
{cout<<"name"<<name<<endl;
}
赋值:不可以在常成员函数中对数据成员进行赋值;可以在成员函数中对数据成员赋值。
非法的赋值方式:
void getData() const
{setAge(34);
//对age进行赋值
}
介绍了这么多,那什么时间使用常数据成员呢?
1.在一个类中,如果一些数据成员需要改变,而有一些数据成员不需要改变,这时就可以把不需要改变的数据成员声明为常数据成员
注意:常成员函数不能调用另一个非const成员函数。