Maine

纵有疾风起,人生不言弃

类和对象 - 详解 C++ 中的常对象和常成员函数

如果希望在初始化对象的值后不再更改它,可以通过添加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函数。

基本上,如果成员函数不调用非常量成员函数并且不修改成员变量的值,则最好将其写为常量成员函数。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注