const在类和对象中的应用
(1)常量数据成员的应用
(2)函数的参数为常量的应用
(3)常量函数的应用
(4)常量对象的应用
1.常量数据成员的应用
如果某个类中数据成员是const,表示这个数据成员不能直接被修改,这就要求const数据成员变量需要初始化,但是在类中,数据成员不允许在类里定义时初始化。
那const成员变量什么时候初始化呢?
分析:类是一种数据类型,所以没有必要在类产生时就让数据成员初始化,这也不符合逻辑。
类中数据成员、函数成员最终的使用都是通过实例的对象后调用,也就是说有了对象,数据成员和函数成员才 有了生命,所以要对数据成员初始化的时机,就应该是对象产生的时刻。
*由分析可知:const数据成员的初始化应该在构造函数中进行,但是const数据成员的初始化必须在构造函数的初始 化表中进行
2.函数的参数为常量的应用
类中函数成员的参数通常使用引用,表示用源头的数据,不会自己再复制一份。如果希望传给函数成员的数据不被破坏,就需要定义成const,通常函数成员的参数const和引用联合使用。
示例代码:
class Demo
{
public:
Demo(int a): m_a(a){}
void Set(const int &x)
{
m_a = x;
}
private:
int m_a;
};
int main()
{
int x = 999;
Demo d(10);
d.set(x);
return 0;
}
3.常量函数的应用
***常量函数的最重要的特点是该函数内部不允许修改类的数据成员。
在C++中,常量函数必须定义在类中,以函数成员的形式出现。常量成员函数的好处就是保证类的封装性,能够有效防止类的数据成员被非法访问。
做一个区分:
const int fun(void); ->这不是常量函数,仅仅表示函数的返回值为常量
int fun(void) const; ->常量成员函数
一个注意点!!!
int fun(void) const; 和 int fun(void); 是否构成重载?
答案是可以构成重载。为社么这里函数名和参数相同也构成重载呢?
因为类的成员函数的第一个参数被隐藏,类中的成员函数第一个参数是this指针被隐藏,普通成员函数的指针是普 通指针,常量成员函数的this指针是常量指针,所以实际上有一个参数不同,所以构成重载。
那么思考一个问题?这俩个函数构成重载,那如何区别调用到常量函数呢?
常量函数和非常量函数重载时,非常量对象调用非常量函数
常量函数和非常量函数重载时,常量对象调用常量函数
常量函数的最重要的特点是该函数内部不允许修改类的数据成员。
示例代码:
class Demo
{
public:
Demo(int a): m_a(a){}
void Set(const int &x)
{
m_a = x;
}
void Set(const int &x)const
{
m_a = x; //这句话编译器会报错,常量函数不可以修改类的数据成员
}
private:
int m_a;
};
int main()
{
int x = 999;
Demo d(10);
d.set(x);
return 0;
}
*对象调用常量函数的规则
(1)非常量对象可以调用常量函数
(2)非常量对象可以调用非常量函数
(3)常量对象可以调用常量函数
(4)常量对象不可以调用非常量函数
(5)常量函数和非常量函数重载时,非常量对象调用非常量函数
(6)常量函数和非常量函数重载时,常量对象调用常量函数
4.常量对象的应用
const Demo d; ->常量对象
应用在常量函数的调用上,因为当常量函数和非常量函数重载时,常量对象能调用常量函数 。
常量对像只能调用常量函数