2

非mumber関数は複数回削除できますが、メンバー関数は1回しか宣言できませんか?これは正しいですか ?私の例は「はい」と言っているようです。

しかし、なぜ ?

class Base{
public:
    int foo(int i);
    //int foo(int i=10); //error C2535: 'void Base::foo(int)' : member function already defined or declared
};

//but it seems ok to declare it multiple times
int foo(int i);
int foo(int i=10);

int foo(int i)
{
    return i;
}

int main (void)
{
    int i = foo();//i is 10 
}
4

3 に答える 3

6

標準(2003)から、§8.3.6/4は次のように述べています。

テンプレート以外の関数の場合、デフォルトの引数を同じスコープ内の関数の後の宣言に追加できます。

標準自体からの例:

void f(int, int);
void f(int, int = 7);

2番目の宣言はデフォルト値を追加します!

§8.3.6/6も参照してください。

そして興味深い(そしていくぶん関連した)トピック:

そして§9.3/2、

クラス定義の外に現れるメンバー関数定義を除いて、またクラステンプレートのメンバー関数の明示的な特殊化とクラス定義の外に現れるメンバー関数テンプレート(14.7)を除いて、メンバー関数は再宣言されないものとします。

お役に立てば幸いです。

于 2011-09-22T17:14:02.940 に答える
1

この簡略化されたバージョンでも同じ結果が得られます。

int foo() ;
int foo() ; // OK -- extern functions may be declared more than once
class C {
  int foo() ;
  int foo() ; // Error -- member function may not be declared more than once
} ;

おそらくその理由は歴史的なものです。多くのCコードがextern関数の再宣言を使用していたため、許可する必要がありました。

于 2011-09-22T17:36:49.017 に答える
0

確かに機能しますが、それは悪い習慣だと思います。

于 2011-09-22T17:17:55.973 に答える