2009-07-17 5 views
8

私はいくつかの奇妙なコードを見つけました...デフォルトのパラメータ値がコールサイトで表示されないコードで定義されている場合はどうなりますか?

//in file ClassA.h: 
class ClassA { 
public: 
    void Enable(bool enable); 
}; 

//in file ClassA.cpp 
#include <ClassA.h> 
void ClassA::Enable(bool enable = true) 
{ 
    //implementation is irrelevant 
} 

//in Consumer.cpp 
#include <ClassA.h> 
.... 
ClassA classA; 
classA.Enable(true); 

明らかに、Consumer.cppClassA.hのみでClassA.cppは含まれていないので、コンパイラはパラメータにデフォルト値があることを見ることができません。

メソッド実装の署名におけるClassA::Enableの宣言されたデフォルト値は、いつどのような効果を持ちますか?これは、メソッドがClassA.cppを含むファイル内から呼び出された場合にのみ発生しますか?

答えて

11

デフォルト値は単なるコンパイル時のものです。コンパイルされたコードにはデフォルト値(メタデータやそのようなもの)はありません。これは基本的にコンパイラの置き換えです。「何も書かなければ、それを指定します。」したがって、コンパイラがデフォルト値を見ることができない場合、は、が1つもないとみなします。

デモ:

// test.h 
class Test { public: int testing(int input); }; 

// main.cpp 
#include <iostream> 
// removing the default value here will cause an error in the call in `main`: 
class Test { public: int testing(int input = 42); }; 
int f(); 
int main() { 
    Test t; 
    std::cout << t.testing() // 42 
      << " " << f() // 1000 
      << std::endl; 
    return 0; 
} 

// test.cpp 
#include "test.h" 
int Test::testing(int input = 1000) { return input; } 
int f() { Test t; return t.testing(); } 

はテスト:メソッド はClassA.cppが含ま ファイル内から呼び出されたとき

g++ main.cpp test.cpp 
./a.out 
1

定義ではなく、宣言にデフォルト値を設定します。

class ClassA { 
public: 
    void Enable(bool enable = true); 
}; 
+0

誰がこれをマークしたのですか?あなたが私に印をつけたら、どうして私は少なくともそれを修正できるのか教えてください。 –

+1

実際には、これをマークしたのは私でした。その理由は、OPが明らかに、これを定義ではなく宣言に入れることが正しいことを知っているということでした。 OPは、そのようなことを定義することの効果は何か、あなたは完全に質問を読むことなく答えたのだろうと思っていました。そして、はい、それをマークする理由を知らせてくれて申し訳ありません。私はそれをしていたはずです。 – Aamir

+0

OPはそれを宣言に入れることについて言及しなかったので、彼が言及した可視性の問題に対する解決策を提案した。 –

1

これはのみ発生しますか?

これは正しいです。しかし、そうすることでほぼ確実に複数の定義エラーが生成されるので、デフォルトはClassA.cpp内の定義のポイントから実際にしか利用できません。

+0

これはエラーではありません。両方の定義がデフォルト値を提供する場合のみ、エラーが生成されます。 –

+0

ファイルが複数回#includeされている場合、実際の関数は複数の定義エラーを引き起こします。これは私が参照していたものです。 –

3

私はこのタイプのコードを初めて見たことは間違いありません。ヘッダーファイルにデフォルト値を設定するIS通常の方法ですが、これはできません。

私の推測では、このデフォルト値は同じファイルに書かれたコードからのみ使用でき、このように書いたプログラマは、関数を呼び出す際にある種の簡単さに入れたいと思っていましたが、外界に見えるインタフェース(ヘッダファイル)を妨害します。

関連する問題