C++ 当()用于声明对象时,为什么不调用构造函数?
可能重复:C++ 当()用于声明对象时,为什么不调用构造函数?,c++,constructor,most-vexing-parse,C++,Constructor,Most Vexing Parse,可能重复: $cat cons.cpp #包括 类矩阵{ 私人: 国际货币单位计数; 公众: 矩阵(){ m_计数=1; 标准::cout 此C++ FAQ Lite条目应该有帮助。 矩阵m1()声明了一个不带参数的函数,并返回一个矩阵。通过向矩阵添加一个方法并尝试在矩阵m1上调用它,可以看出这一点: #include <iostream> class Matrix { private: int m_count; public: Matrix() {
$cat cons.cpp
#包括
类矩阵{
私人:
国际货币单位计数;
公众:
矩阵(){
m_计数=1;
标准::cout
此C++ FAQ Lite条目应该有帮助。
矩阵m1()
声明了一个不带参数的函数,并返回一个矩阵
。通过向矩阵添加一个方法并尝试在矩阵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;
}
#包括
类矩阵{
私人:
国际货币单位计数;
公众:
矩阵(){
m_计数=1;
std::cout这将完成您尝试执行的操作:
int main() {
std::cout << "before" << std::endl;
Matrix m1; // <----
std::cout << "after" << std::endl;
}
intmain(){
std::cout从C语言的角度思考:
int data_member();
实际上是函数取void并返回int的原型。当您将其更改为:
T data();
它仍然是一个函数声明,正在重新调整T
。当需要将其声明为变量时,可以执行以下操作:
T data; // int data;
@Lazer:为了说服自己,试着使用m1(例如访问m1.m_计数)…在C++11中,所有构造函数调用都可以使用大括号,这避免了C++最麻烦的解析,即矩阵m1{};这不是“最麻烦的解析”,最麻烦的解析是当您尝试声明和对象并将临时初始化的值传递给它的一个或多个构造函数参数时。例如,ab(a());
Matrix m1();
只是一个常规的函数声明。@CharlesBailey:最麻烦的解析是尽可能将声明视为函数声明。这个问题确实是另一个最麻烦的解析问题。
T data();
T data; // int data;