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 条目也应该很有帮助。

List 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++ 中,如果你用括号初始化一个变量,它实际上声明了一个不带参数并返回该类型的函数。

于 2012-02-26T08:34:48.857 回答