专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

C++常对象和常成员函数详解

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/17 11:56:26       共计:3581 浏览
如果希望某个对象的值初始化以后就再也不被改变,则定义该对象时可以在前面加 const 关键字,使之成为常量对象(简称“常对象”)。例如:
class CDemo{
public:
    void SetValue(){ }
};
const CDemo Obj;  // Obj 是常量对象
在 Obj 被定义为常量对象的情况下,下面这条语句是错误的,编译不能通过:
Obj.SetValue();
错误的原因是,常量对象一旦初始化后,其值就再也不能更改。因此,不能通过常量对象调用普通成员函数,因为普通成员函数在执行过程中有可能修改对象的值。

但是可以通过常量对象调用常量成员函数。所谓常量成员函数,就是在定义时加了 const 关键字的成员函数(声明时也要加)。例如:
#include<iostream>
using namespace std;
class Sample{
   public:
   void GetValue() const;  //常成员函数
};
void Sample::GetValue() const  //常成员函数
{
}
int main(){
    const Sample o;
    o.GetValue();  //常量对象上可以执行常量成员函数
    return 0;
}
上面的程序在 Visual Studio 中没有问题,但在 Dev C++ 中,要为 Sample 类编写无参构造函数才可以。在 Dev C++ 中,常量对象如果使用无参构造函数初始化,就需要显式写出无参构造函数。

常量对象上可以执行常量成员函数,是因为常量成员函数确保不会修改任何非静态成员变量的值。编译器如果发现常量成员函数内出现了有可能修改非静态成员变量的语句,就会报错。因此,常量成员函数内部也不允许调用同类的其他非常量成员函数(静态成员函数除外)。

思考题:为什么上面一段话要强调“非静态成员变量”和“静态成员函数除外”?

两个成员函数的名字和参数表相同,但一个是 const 的,一个不是,则它们算重载。例如:
#include <iostream>
using namespace std;
class CTest{
private:
    int n;
public:
    CTest(){n = 1;}
    int GetValue() const { return n; }
    int GetValue() { return 2*n; }
};
int main(){
    const CTest objTestl ;
    CTest objTest2;
    cout << objTestl.GetValue () << "," << objTest2.GetValue();
    return 0;
}
程序的输出结果是:
1, 2

可以看到,通过常量对象调用 GetValue 函数,那么被调用的就是带 const 关键字的 GetValue 函数;通过普通对象调用 GetValue 函数,被调用的就是不带 const 关键字的 GetValue 函数。

基本上,如果一个成员函数中没有调用非常量成员函数,也没有修改成员变量的值,那么将其写成常量成员函数是好的习惯。
版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:C++成员对象和封闭类详解 | ·下一条:C++静态成员变量和静态成员函数详解

Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有