【问题标题】:const in function prototype函数原型中的 const
【发布时间】:2015-12-08 14:33:57
【问题描述】:

如果我们有这样的函数原型:

const CString function(...)
{
CString x;
//do some stuff
return x;
}

这是否意味着函数返回一个 const CString ?因为 C++ 中的 const 可以放在类内部的方法前面,告诉编译器属性不会被修改(或不可变)

我问这个“愚蠢”的问题,因为在另一种情况下,我们可以有这样的事情:

static CString function(...)
{ }

在这种情况下,静态与“函数”相关,而不是返回的变量。

【问题讨论】:

  • 你的意思是CString function() const {...}
  • 不,Const CString function() {}
  • C++ const in getter的可能重复

标签: c++


【解决方案1】:

在 C++ 中,const return_type function_name(params) 表示您有一个返回 const return_type 的函数。如果您有static return_type function_name(params),那么这会将函数标记为静态,并且您不再需要该类的实例来调用此函数。如果你想将一个函数标记为const,这意味着它不会影响类内容,那么你需要在函数之后放置const

return_type function_name(params) const
                                  ^^^^^

【讨论】:

  • 我想知道为什么一个函数不能返回一个“静态”变量,而它可以返回一个常量。
  • @Aminos 静态变量是只存在于一个地方的变量。将其作为回报是没有意义的。你可以在函数中有一个静态变量,然后返回对它的引用。
【解决方案2】:

这是否意味着函数返回一个 const CString ?

是的。

因为 C++ 中的 const 可以放在类内部的方法前面,告诉编译器属性不会被修改(或不可变)

不,不能,const 必须放在 方法之后才能实现。

 class MyClass {
     // ...
     const CString function();
     // ...
 }

一个返回const CString的函数。

 class MyClass {
     // ...
     CString const function();
     // ...
 }

同样的事情。

 class MyClass {
     // ...
     CString function() const;
     // ...
 }

可以在常量对象上调用的函数,因为它“承诺”不会改变内部状态。



根据经验,const 总是声明为常量的事物之后...

...除了用于旧的 C 风格 const <type>,为了向后兼容而保留。

下面两行是同一个东西,一个指向常量int的常量指针。请注意,要使 指针 保持不变,const 必须 跟在 * 后面:

const int * const p1; // the exception
int const * const p2;

【讨论】:

  • 是的,这就是我想说的,但也许我选择了错误的词来描述它。
【解决方案3】:

要从函数中返回 const 值,请使用:

const CString function(...)
{
    CString x;
    //do some stuff
    return x;
 }

告诉编译器属性不会改变使用:

CString myClass::function(...) const
{
    CString x;
    //do some stuff
    return x;
 }

【讨论】:

    【解决方案4】:

    const CString function(...) 返回一个const CString

    但它已被弃用,因为它很少有用,并且在临时不允许 move 的事实。因此,在 CString s; s = foo(); 中,完成了副本而不是 move

    最重要的用法是禁止

    foo() = CString(..);
    

    C++11 在方法和 r 值引用上引入了 ref 限定符,允许以不同方式修复它:

    Obj& operator = (const Obj& rhs) & ; // Note the final &
    

    【讨论】:

      【解决方案5】:

      声明为const CString function(...) 的函数返回一个常量CString。这在 C++ 中和在 C 中是一样的。

      如果你有这样定义的 C++ 方法:

      void MyClass::function(void) cont;
      

      这意味着function方法不会修改对象。

      【讨论】:

        【解决方案6】:

        出现在方法之前的const描述了方法返回类型的属性。 所以, const CString method_name(); 表示该方法返回一个 const CString 对象,即该方法的调用者无法修改的对象。

        出现在方法之后的const描述了方法本身的属性。它告诉该方法不会“变异”或“修改”它所操作的对象。

        所以, 常量 CString method_name() 常量; 意味着该方法不能修改用于调用该方法的对象的任何成员变量。它与方法的返回类型无关。

        让我们用一个例子来看看这个。

        class Foo
        {
          int x;
          int GetX() const {return x;}
          void SetX(int i_x)  {x = i_x;}  
        };
        

        在上面的类定义中,GetX() 是一个 const 方法,即它不会修改用于调用它们的对象。这是什么意思?当你声明一个类时,每个成员函数都有一个版本,它们被加载到内存中。此外,所有非静态成员方法都需要一个对象来调用它们。这是如何实现的?当您声明类的非静态成员方法时,C++ 编译器会巧妙地更改方法的签名以期望“this”指针,即指向用于调用该方法的对象的指针。 对于非常量方法,预期的“this”指针的类型是 Class*。所以我们上面的 SetX() 方法看起来像: void SetX(Foo* this, int i_x) {this->x = i_x;} 你可以使用this指针来修改对象(x是对象的一部分吧!) 但是,对于 const 方法,传递的“this”指针的类型是 const Class* 即您不能使用“this”指针修改对象。所以GetX变成 int GetX(const Foo* this) {return this->x; } 由于 this 指针的类型是 const Foo*,因此您无法更改指针指向的对象,即您无法执行以下操作: x = 100; 这将转化为 this->x = 100;编译器会抱怨的。

        【讨论】:

          猜你喜欢
          • 2014-02-13
          • 1970-01-01
          • 1970-01-01
          • 2019-09-14
          • 1970-01-01
          • 2021-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多