本文讲解const关键字在类中的使用情况。
常成员变量
在类中的成员变量的前面加上const关键字,表示该成员变量初始化之后不能再改变,注意:常成员变量的唯一初始化方法 用 构造函数的初始化列表。换句话说,在构造函数的内部进行赋值运算的,左边必须是变量(可修改的值),const修饰的变量实际上已经不是变量了。
class student {
public:
const int age; //常成员变量
public:
student(int t_age) :age(t_age) {};
//这种方法是错误的
//student(int t_age)
//{
// age = t_age;
//}
};
常成员函数
两点要求:
①const关键字加在函数头尾部,加在首部的是表示返回值是const变量。
②在函数声明和定义的函数头尾部都要加const关键字
const成员函数可以访问所有的成员变量,但是不能修改他们的值,const关键字的作用有两点:一是限制不能修改传入参数的值,二是提醒程序员这是const函数,不要做修改。
class student {
public:
const int age;
public:
student(int t_age) :age(t_age) {};
void get_age() const; //const 成员函数
};
void student::get_age() const //定义处也要加上const关键字
{
cout << "age = " << endl;
}
常对象
一点要求:常对象只能访问常成员(常成员变量和常成员函数),另外在类外部定义的对象也不能访问Private成员,这是公认的。
两个问题:
①为什么不能访问非常成员?
因为一旦定义为常对象,那么就不是变量了,而是常量,那么该对象的所有成员都是常量,不能修改。哪怕用户没有修改不是常成员变量的值,也要预防,因此一棒子打死,干脆直接不让访问非常成员变量和非常成员函数了。
②为什么可以访问常成员?
因为常成员已经有const限制了,不用怕用户会修改他们的的值。
class student {
private:
char sex;
public:
const int age;
int num;
public:
student(int t_age) :age(t_age) {};
void get_age() const; //const 成员函数
};
void student::get_age() const //定义处也要加上const关键字
{
cout << "age = " << endl;
}
int main()
{
const student stu = student(10); // 也可以student const stu = student(10);
//还可以定义指针类型的 const student *stu = new student(10);
//或者student const *stu = new student(10);
stu.num = 0; //不能访问,stu是常值,他的所有成员都是常值,不能修改;
stu.age = 0; //不能修改,age 是const类型的,常值
cout << stu.age << endl; //可以调用
cout << stu.sex; //不能访问,sex是private成员
stu.get_age(); //可以调用
return 0;
}
总结:常对象只能访问常成员。