【问题标题】:Why modifiers like const not allowed on nonmember functions为什么非成员函数上不允许使用 const 等修饰符
【发布时间】:2015-03-18 07:29:07
【问题描述】:

我不明白为什么不允许像 constvolatile 这样的修饰符用于非成员函数。

下面是我累了的示例代码

class A
{
private:
    int var;
public:
    int func();
};

int A::func()
{
    // Some calculation on using var
    int temp = var + 10;
    return temp;
}

void func2( const A& tempObj ) const;

void func2( const A& tempObj ) 
{
    std::cout << "temp obj called : " << tempObj.func() << std::endl;
}

int main()
{
    A aobj;
    aobj.func();
    func2( aobj );
    return 0;
}

对于void func2( const A&amp; tempObj ) const; 会引发编译器错误error C2270: 'func2' : modifiers not allowed on nonmember functions

我还收到另一个错误error C2662: 'A::func' : cannot convert 'this' pointer from 'const A' to 'A &amp;' for tempObj.func() in func2 在这里我假设成员函数 func 将被调用而没有任何错误。

【问题讨论】:

  • 也请帮助他理解cannot convert 'this' pointer from 'const A' to 'A &amp;'。我认为这里的转换正在以其他方式发生。
  • 我在您的示例中没有看到 volatile 关键字?
  • 你能解释一下你认为修饰符是什么意思吗?
  • 我确实检查了更新,您只是添加了另一个问题,但没有回答我的问题。您认为非成员函数上的 const 限定符的含义是什么?
  • @Krishna_Oza 这就是const A&amp;const 的目的。

标签: c++ constants volatile


【解决方案1】:

const 修饰符声明成员函数不会修改该函数所属对象的数据成员。

这就像保证在对象aobj 上调用该函数不会修改该对象的内部状态。因此,假设aobj 也被声明为const,您仍然可以在其上调用该函数;相反,您将无法调用非const 函数成员。

如果函数不是类的成员,则应用 const 修饰符是没有意义的。在另一种语言中,这可能意味着该函数无法修改全局变量;但该语言不是 C++。

【讨论】:

    【解决方案2】:

    假设每个非静态成员函数上都有一个隐藏参数:

    int A::func(A* this) {...}
    

    如果你声明一个成员函数 const 或 volatile,它会被添加到隐藏参数中,很像下面这样:

    int A::func(const A* this) {...}
    

    像 python 这样的一些语言会明确成员函数的实例参数,所以你可以在类定义中写 def func(self): 来声明非静态函数。

    【讨论】:

      【解决方案3】:

      类方法上的const 限定声明该方法不修改任何(非可变)成员变量。

      因此,在非成员函数上声明它没有任何意义,因为它没有可修改的成员变量。

      const 限定条件非常有用,因为它明确表明在 const 变量上调用此方法是安全的,而不会破坏该变量的常量性。

      【讨论】:

        【解决方案4】:

        在 C++ 中,成员函数修饰符适用于调用函数的对象。这就是语言对这些修饰符的用途。

        非成员函数没有这样的对象,所以限定是没有意义的。可以想象允许 cv-qualifying non-members 的语言没有任何效果,但在我看来,这只会令人困惑。人们也可以想象 cv 限定词对非成员具有不同的含义,但现实就是这样。这就是语言的设计方式。

        【讨论】:

        • 仍然,const 对非成员可能意味着“不更改全局变量”之类的东西,另请参阅 stackoverflow.com/questions/14127379/…
        • @davidhigh 对,但是“为什么在非成员函数上不允许使用 const 之类的修饰符”的答案是因为修饰符适用于对象,而不适用于其他任何东西。
        • @davidhigh,实际上,该限制将作为“纯”的一部分出现,这已被提议并且至少 GCC 有一个属性。
        • @Krishna_Oza A::func() 不是 const 成员函数,因此不能通过 const 引用调用它。
        • @Krishna_Oza 不。在您的情况下,“this”指针是tempObj,即const A。但是你试图在它上面调用一个非const 函数,它的“this”需要一个A&amp;。所以这是从const A&amp;A&amp; 的转换失败。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-01
        相关资源
        最近更新 更多