可能重复:
为什么使用一组空括号来调用没有参数的构造函数是错误的?
$ 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;
。显然我错了。
Matrix m1(); // m1 is a function whose return type is Matrix.
此C ++ FAQ lite条目也应该有用。
List x之间有什么区别;和列表x();
Matrix m1(); // m1 is a function whose return type is Matrix.
此C ++ FAQ lite条目也应该有用。
List x之间有什么区别;和列表x();
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()'
从C语言的角度思考:
int data_member();
实际上是一个函数的原型,它取出了void并返回int。当你改变它时:
T data();
它仍然是一个函数声明,重新调整 T
。当您需要将其声明为变量时,您可以:
T data; // int data;
这将做你想做的事情:
int main() {
std::cout << "before" << std::endl;
Matrix m1; // <----
std::cout << "after" << std::endl;
}
在C ++中,如果使用parens初始化变量,它实际上声明了一个不带参数并返回该类型的函数。