当前位置:  开发笔记 > 编程语言 > 正文

当与C++中的方法一起使用时,const运算符的含义是什么?

如何解决《当与C++中的方法一起使用时,const运算符的含义是什么?》经验,为你挑选了2个好方法。

给出这样的声明:

class A {
public:
    void Foo() const;
};

这是什么意思?

谷歌出现了这个:

如果成员函数可以在const(this)对象上操作,则应在其后面使用const关键字声明它们.如果函数未声明为const,则无法应用于const对象,并且编译器将给出错误消息.

但我发现有点令人困惑; 任何人都可以用更好的条件吗?

谢谢.



1> Henk..:

考虑一下你班级的变化A.

class A {
public:
    void Foo() const;
    void Moo();

private:
    int m_nState; // Could add mutable keyword if desired
    int GetState() const   { return m_nState; }
    void SetState(int val) { m_nState = val; }
};

const A *A1 = new A();
A *A2 = new A();

A1->Foo(); // OK
A2->Foo(); // OK

A1->Moo(); // Error - Not allowed to call non-const function on const object instance
A2->Moo(); // OK

const函数声明中的关键字向编译器指示函数在合同中有义务不修改状态A.因此,您无法在其中调用非const函数,A::Foo也无法更改成员变量的值.

为了说明,Foo()可能不会A::SetState因为声明为非调用而调用const,A::GetState但是可以,因为它是显式声明的const.m_nState除非使用关键字声明,否则不得更改该成员mutable.

这种用法的一个例子const是'getter'函数来获取成员变量的值.

@ 1800信息:我忘了可变!

mutable关键字指示编译器以接受修改的成员变量否则就会导致编译错误.它在函数需要修改状态时使用,但无论修改如何,对象都被视为逻辑一致(常量).



2> Pat Notz..:

这不是一个答案,只是一个侧面评论.这是强烈推荐申报变量和常量const尽可能.

    这会将您的意图传达给您班级的用户(甚至/尤其是您自己).

    编译器会让你对这些意图保持诚实. - 即,它就像编译器检查文档.

    根据定义,这可以防止您不期望的状态更改,并且可能允许您在方法中做出合理的假设.

    const有一种有趣的方式来传播你的代码.因此,const尽可能早地开始使用是一个非常好的主意.决定const在游戏后期启动代码可能会很痛苦(容易,但很烦人).

如果你正在使用一种静态的语言,编译时检查,尽可能多地使用它们是一个好主意......它只是另一种测试.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有