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

Posted

技术标签:

【中文标题】在同一个类/结构中具有相同签名的相同函数?超载?【英文标题】:Same function with same signatures in the same class/struct? Overload? 【发布时间】:2014-04-07 12:39:05 【问题描述】:

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

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

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(这意味着隐式传递的this指针是const)。第二个不是。 它们的签名不同,一个是const,另一个不是 @BenjaminBannier 小修正:隐式传递的this 指针是 const。当然,这就是你的意思。 @sehe 当然是对的;相关段落是 C++11 中的 §9.3.2/1。 谢谢大家,帮了大忙:)谢谢 【参考方案1】:

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

你可能想知道怎么可能?

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

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

因此,您有两个签名不同的方法,完全没有问题。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于在同一个类/结构中具有相同签名的相同函数?超载?的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 类方法具有与构造函数相同的重载签名

在Java中,是不是可以有两个具有完全相同签名的函数,除了一个是静态的

当两个重载具有相同的签名时调用构造函数重载

具有相同签名的函数

为啥具有相同名称但不同签名的多个继承函数不会被视为重载函数?

C#中具有相同名称和签名但返回类型不同的方法