繁体   English   中英

在同一个类/结构中具有相同签名的相同 function? 超载?

[英]Same function with same signatures in the same class/struct? Overload?

我在 boost 示例中看到了用于构建 state 机器的代码部分。 让我困惑的是这两个成员函数ElapsedTime()? 这是否允许两个函数具有相同的签名,例如 function 名称和参数类型?

我用谷歌搜索了很多但没有找到相关信息。 对此的任何建议将不胜感激。

struct Active : sc::simple_state< Active, StopWatch, Stopped >
{
public:
    typedef sc::transition< EvReset, Active > reactions;

    Active() : elapsedTime_( 0.0 ) {}
    double ElapsedTime() const { return elapsedTime_; }
    double & ElapsedTime() { return elapsedTime_; }

private: 
    double elapsedTime_;
};

它们没有相同的签名 - 一个是const而另一个不是。 Constness是成员函数签名的一部分。

函数的签名由名称和参数类型定义。 你有两个具有相同名称的函数,但它们没有相同的参数!

你可能想知道它怎么可能?

因此,每个成员函数都隐式获取另一个参数:这是“this”指针。 指向调用该方法的对象的指针。

在方法的末尾添加const时,将“this”参数指定为const的const指针 在另一个方法(没有const)中,“this”的类型只是const指针

因此,您有两种具有不同签名的方法,并且根本没有问题。

签名是不同的,因为一个具有const限定符。 http://www.cprogramming.com/tutorial/const_correctness.html

这是允许的吗

over.load#2.2状态允许这种用法:

如果其中任何一个是 function 成员 function 声明 ([class.static]),则不能重载具有相同名称和相同参数类型列表的成员 function 声明。 同样,具有相同名称、相同参数类型列表和相同模板参数列表的成员 function 模板声明不能重载,如果它们中的任何一个是 static 成员 function 模板声明。 为重载决策 ([over.match.funcs]) 的目的为成员函数构造的隐式 object 参数的类型在比较参数类型列表以执行此规则时不被考虑。 相反,如果在一组具有相同名称和相同参数类型列表的成员 function 声明中没有成员 static 成员 function 声明,则如果这些成员 function 声明在其隐式 object 参数的类型不同,则可以重载. [示例:以下说明了这种区别:

(结束引用)

现在,在您的示例中,第一个重载具有const限定符,这意味着其隐式 object 参数的类型为const Active&而第二个重载没有const限定符,这意味着其隐式 object 参数的类型为Active& 此外,没有 static 成员 function 声明具有相同的ElapsedTime -type-list 的 ElapsedTime。 因此,使用上面引用的语句,这意味着允许给定的用法。

笔记

请注意,当前接受的答案在技术上是不正确的,因为它声称this指向 const 的 const 指针 但实际上,标准规定const限定成员 function 中, this指针的类型为const X*而在非 const 限定成员 function 中, this指针的类型为X*

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM