在类的函数中使用'const'

这个问题在这里已经有了答案:

  • C ++方法声明中最后一个“const”的含义? 7个答案

  • const方法可以在const对象上调用:

    class CL2
    {
    public:
        void const_method() const;
        void method();
    
    private:
        int x;
    };
    
    
    const CL2 co;
    CL2 o;
    
    co.const_method();  // legal
    co.method();        // illegal, can't call regular method on const object
    o.const_method();   // legal, can call const method on a regulard object
    o.method();         // legal
    

    此外,它还告诉编译器,const方法不应该改变对象的状态,并会捕获这些问题:

    void CL2::const_method() const
    {
        x = 3;   // illegal, can't modify a member in a const object
    }
    

    上述规则有一个例外,使用mutable修饰符,但在冒险进入该领域之前,您应首先熟悉const正确性。


    其他人已经回答了有关const成员函数的问题的技术方面,但这里有一个更大的图像 - 这是const正确性的想法。

    长话短说,const正确性是澄清和强化你的代码的语义。 举一个简单的例子。 看看这个函数声明:

    bool DoTheThing(char* message);
    

    假设有人写了这个函数,你需要调用它。 你知道DoTheThing()对char缓冲区做了什么吗? 也许它只是将消息记录到文件中,或者它可能会更改字符串。 通过查看函数声明,您无法确定调用的语义。 如果函数不修改字符串,那么声明是const不正确的。

    让你的函数也是正确的也有实际的价值。 也就是说,根据调用的上下文,你可能无法调用const不正确的函数。 例如,假设您知道DoTheThing()不会修改传递给它的字符串的内容,并且您拥有以下代码:

    void MyFunction()
    {
      std::string msg = "Hello, const correctness";
      DoTheThing(msg.c_str());
    }
    

    上面的代码不会编译,因为msg.c_str()返回一个const char* 。 为了得到这个代码编译,你必须做这样的事情:

    void MyFunction()
    {
      std::string msg = "Hello, const correctness";
      DoTheThing(msg.begin());
    }
    

    ...甚至更糟糕:

    void MyFunction()
    {
      std::string msg = "Hello, const correctness";
      DoTheThing(const_cast<char*>(msg.c_str()));
    }
    

    无论如何,这两者都可能比原来的代码“更好”。 但是因为DoTheThing()是以常量不正确的方式编写的,所以必须围绕它来弯曲代码。


    const在附加到非静态类方法时会告诉编译器,您的函数不会修改对象的内部状态。

    这在两个方面很有用:

  • 如果您编写的代码改变了const方法中的内部状态,那么编译器会捕获错误,将编程错误从运行时移至编译时。
  • 如果客户端代码在一个常量指针上调用非const方法,那么编译器会捕获该错误,确保保持“不改变事物的链”。
  • 通常,您想要将所有非变异的非静态类方法声明为const。 这允许调用代码在指针上使用const限定符,并且它有助于捕获错误。

    典型的C ++:你可以声明一个类变量“mutable”,然后从const方法中改变它。

    链接地址: http://www.djcxy.com/p/40413.html

    上一篇: Using 'const' in class's functions

    下一篇: What is the meaning of a const at end of a member function?