11

重複の可能性:
括弧の空のセットを使用して引数なしでコンストラクターを呼び出すとエラーになるのはなぜですか?

$ cat cons.cpp
#include <iostream>

class Matrix {
private:
    int m_count;

public:
    Matrix() {
        m_count = 1;
        std::cout << "yahoo!" << std::endl;
    }
};

int main() {
    std::cout << "before" << std::endl;
    Matrix m1();                         // <----
    std::cout << "after" << std::endl;
}
$ g++ cons.cpp
$ ./a.out
before
after
$

構文は何をしますMatrix m1();か?

と同じだと信じていましたMatrix m1;。明らかに私は間違っています。

4

4 に答える 4

12
Matrix m1(); // m1 is a function whose return type is Matrix.

また、この C++ FAQ lite エントリも役立つはずです。

リストx;の間に違いはありますか?およびリスト x();

于 2012-02-26T07:47:13.250 に答える
3

Matrix m1()パラメータを取らず、 を返す関数を宣言しますMatrix。にメソッドを追加しMatrixて呼び出してみると、これがそうであることがわかりm1ます。

#include <iostream>

class Matrix {
private:
    int m_count;

public:
    Matrix() {
        m_count = 1;
        std::cout << "yahoo!" << std::endl;
    }
    void foo() {}
};

int main() {
    std::cout << "before" << std::endl;
    Matrix m1();
    m1.foo();
    std::cout << "after" << std::endl;
}

与えるerror: request for member 'foo' in 'm1', which is of non-class type 'Matrix()'

于 2012-02-26T07:51:38.703 に答える
1

C 言語の観点から考えてみましょう。

int data_member();

実際には、void を取り、int を返す関数のプロトタイプです。次のように変更すると:

T data();

それはまだ関数宣言であり、 を返しTます。変数として宣言する必要がある場合は、次のようにします。

T data; // int data;
于 2012-02-26T09:00:28.880 に答える
0

これはあなたがやろうとしていることをします:

int main() {
    std::cout << "before" << std::endl;
    Matrix m1;                         // <----
    std::cout << "after" << std::endl;
}

C ++では、変数をparensで初期化すると、実際にはパラメーターを受け取らない関数を宣言し、その型を返します。

于 2012-02-26T08:34:48.857 に答える