3

私が次のクラスを持っているとしましょう:

class A
{
public:
    A() {
    }

    A(int a):_a(a){
    }

    int _a;
};

そして次の関数:

void someFunc (A a)
{
    cout << a._a;
}

したがって、プログラムの次の行は正常に機能します。

someFunc (5); // Calls A(int a) Constructor.

しかし、以下はそうではありません:

someFunc(); //Compile error

整数を取得するときにAをビルドできる場合は、引数なしで呼び出されたときに、デフォルトのコンストラクターを使用してAをビルドしてみませんか?

4

5 に答える 5

6

someFunc()引数が必要であり、そうでないオーバーロードを提供していないためです。intからへの暗黙の変換Aが存在しますが、それは、関数のシグネチャを無視して、引数なしで呼び出すことができるという意味ではありません。引数なしで呼び出したい場合は、デフォルト値をに割り当てますa

void someFunc(A a = A()) { 
    /* stuff */
}
于 2012-09-13T21:08:55.857 に答える
3

変換可能であることが判明した引数を使用して関数を呼び出さなかったため、引数を指定せずに関数を呼び出しまし。これは別のオーバーロードであり、提供していないものです。

次のオプションを検討してください。

  • 次のような関数を呼び出しますsomeFunc(A())
  • 関数パラメーターのデフォルト値を定義しますvoid someFunc (A a = A()) { ... }
  • 引数のないオーバーロードを提供します。void someFunc() { someFunc(A()); }
于 2012-09-13T21:09:45.807 に答える
1

これは、の署名がの署名とsomeFunc()一致しないためですvoid someFunc (A a)

C ++標準によると、セクション13.3.2.3:

  • まず、実行可能な関数であるために、候補関数は、リスト内の引数と数が一致するのに十分なパラメーターを持っている必要があります。
  • m個を超えるパラメーターを持つ候補関数は、(m + 1)-stパラメーターにデフォルトの引数がある場合にのみ実行可能です。

この場合、これはいずれも当てはまらないため、空のパラメータリストを使用した呼び出しでは実行可能void someFunc (A a)とは見なされません。

于 2012-09-13T21:10:09.787 に答える
0

Nitpick。2003 C ++標準から、

17.4.3.2.1グローバル名----アンダースコアで始まる各名前は、グローバル名前空間で名前として使用するために実装に予約されています

変数名を_で始めるのはお勧めできません。特に、そのプラクティスを名前付き変数引数(int foo(int _a))に拡張したり、考えずにキャメルケース(int _MyVar)で実行したりする場合があります。私は個人的に次のようなことをします

int a_;

実際に問題が発生することはありますか?おそらくそうではありません。ただし、アンダースコアで何かを始めないことをお勧めします。もちろん、名前のどこかに2つのアンダースコアを付けたり、アンダースコアで始まり、その後に大文字を付けたりしないでください。

于 2012-09-13T21:27:03.453 に答える
0

someFunc(5)私はここで実際に答えを提供していませんが、それはすべて同じように有用な情報です...それは間違った操作につながるか、単に誤解を招く可能性があるため、本当に仕事を許可したくない場合があります。このような場合、コンストラクターを次のように宣言できますexplicit

class A
{
public:
    A() {}   // Are you sure you don't want to initialise _a here?

    explicit A(int a) :_a(a) {}

    int _a;
};

そして、他の人がすでに言っているように、あなたは以下のデフォルトパラメータを指定することができますsomeFunc

void someFunc( A a = A() );

今:

someFunc();     // Calls A() by default

someFunc(5);    // Not allowed because of implicit construction

someFunc(A(5)); // Caller must pass an instance of A
于 2012-09-13T21:59:27.263 に答える