【问题标题】:Quick one about const in c++快速了解 C++ 中的 const
【发布时间】:2012-03-17 17:23:33
【问题描述】:

我知道声明返回类型 const 的正确方法是这样写:

int foo() const;

但在某些情况下这对我不起作用,那么我可以使用:

const int foo();

这些有什么区别,为什么我可以在所有情况下使用后者而不是第一个。

我不能使用第一个的一个例子是当我想返回一个在方法之外定义的布尔数组。

亲切的问候,

/马库斯

【问题讨论】:

  • int foo() const; 没有返回类型const。这意味着foo() 是一个类的成员函数,foo() 承诺不对*this 对象进行任何更改。

标签: c++ methods constants return


【解决方案1】:

我明白声明返回类型 const 的正确方法是这样写:

int foo() const;

您的理解不正确。以上所做的是将foo() 声明为const 成员函数。这与foo() 的返回类型无关。

欲了解更多信息,请参阅What are the semantics of a const member function?

【讨论】:

    【解决方案2】:

    int foo() const; 表示foo() 作为成员函数不会修改类的数据成员。

    const int foo(); 表示foo() 是一个函数,其返回值为const int(实际上是int)。

    【讨论】:

    • 其实int const foo()声明了一个返回类型为int的函数。函数的返回类型不能为 int const,因为非类右值始终具有 cv 非限定类型。
    【解决方案3】:

    前者用于类的方法函数。这意味着这个方法函数不会(逻辑上)改变对象的数据。

    【讨论】:

      【解决方案4】:

      只有第二个示例将返回类型声明为 const。所以如果你想返回一个 const 值,那就是这样做的方法(也是我相信的唯一方法)

      第一个 sn-p 声明非静态成员函数中的 this 指针指向一个 const 对象(即该方法不会修改该对象)。

      【讨论】:

        【解决方案5】:

        首先,

        int foo() const;
        

        int foo();
        

        是一对可以定义为类成员函数的函数。它们的返回类型都是 int

        当该类的 const 对象调用函数 foo() 时,第一个会响应。

        这个函数

        const int foo();
        

        可以在任何地方定义。返回类型是 const int,因此您必须将函数分配给 const int 变量。

        【讨论】:

          【解决方案6】:

          第一个表示该方法不会改变任何类成员变量(直接或间接)。这基本上意味着在这个方法中不能分配任何类成员,只能在方法体中调用<method> () const

          第二个表示返回值不能更改。

          【讨论】:

            【解决方案7】:

            const 修改它之前的内容;在

            int foo() const;
            

            函数是 const,而不是返回值。 (经过 定义,如果函数的this 指针的类型是 指向常量的指针。只有成员函数可以是 const。)

            要使返回类型为 const,请将 const 紧跟在 返回类型,例如:

            int const foo();
            

            但是请注意,对于非类类型,此 const 会被忽略;回报 value 将是一个右值(临时),并且只有类类型右值具有 cv 限定类型。 (我认为一些编译器甚至会警告 以上。)

            【讨论】:

              【解决方案8】:
              int foo() const;
              

              这不声明返回类型const。它声明它是一个const 成员函数:它可以在const 对象上调用,并且不允许修改该对象的任何(非mutable)成员。

              const int foo();
              

              这声明返回类型是const;但这样做没有多大意义。

              【讨论】:

              • 是吗?函数的返回类型是 prvalue (如果它不是崇敬的话),并且非类类型的 prvalues 永远不会被 cv 限定,所以要么int const foo()是非法的,或者它声明了一个返回类型为int 的函数。 (我希望它是非法的,但我认为由于历史原因,它被接受了,const 被忽略了。)
              • @JamesKanze:它可能被忽略部分是因为它是多余的(无论有没有 const,都无法修改它),部分是为了与类类型保持一致(标准必须考虑的一种不太特殊的情况使用模板时!)
              • @KenWayneVanderLinde 它被忽略了,因为标准非常清楚地表明非类类型的右值(C++ 11 中的右值)不是 cv 限定的。这可以追溯到 C (其中右值不是 cv 限定的,句号)。也就是说:你不能拥有int const 类型的右值(prvalue),因为这种东西在语言中不存在。
              • @JamesKanze:你是对的,它没有;我应该在回答之前检查我的假设。
              • @JamesKanze:是的,我知道标准是这么说的,prvalues 不能被 cv 限定是完全有道理的。我只是想提供一个可能的理由,说明为什么委员会决定忽略这些 cv 限定符,而不是使它们成为非法。
              猜你喜欢
              • 1970-01-01
              • 2012-03-03
              • 2014-09-10
              • 1970-01-01
              • 2015-11-14
              • 1970-01-01
              • 2016-02-17
              • 1970-01-01
              • 2015-10-16
              相关资源
              最近更新 更多