C++ 默认构造函数c++;

C++ 默认构造函数c++;,c++,constructor,default-constructor,most-vexing-parse,C++,Constructor,Default Constructor,Most Vexing Parse,我试图理解默认构造函数(如果您不编写,则由编译器提供)与您自己的默认构造函数是如何工作的 例如,我写了一个简单的类: class A { private: int x; public: A() { std::cout << "Default constructor called for A\n"; } A(int x) { std::cout << "Argument

我试图理解默认构造函数(如果您不编写,则由编译器提供)与您自己的默认构造函数是如何工作的

例如,我写了一个简单的类:

class A
{
    private:
        int x;
    public:
        A() { std::cout << "Default constructor called for A\n"; }
        A(int x)
        {
            std::cout << "Argument constructor called for A\n";
            this->x = x;
        }
};

int main (int argc, char const *argv[])
{
    A m;
    A p(0);
    A n();

    return 0;
}
A类
{
私人:
int x;
公众:
A(){std::cout
声明一个名为
n
的函数,该函数不接受任何参数并返回
a

因为它是一个声明,所以不会调用/执行任何代码(尤其是没有构造函数)

在那个声明之后,你可以写一些

A myA = n();
这将编译。但它不会链接!因为函数
n
没有定义

A n();
可以解析为具有空初始值设定项或函数声明的对象定义

语言标准规定,歧义总是以有利于功能声明的方式解决(§8.5.8)


因此,
n
是一个没有参数的函数,对于最后一个未调用构造函数的函数,它返回一个
a


因此,甚至没有生成任何代码。您所做的只是告诉(声明)编译器有一个函数
n
,它返回
a
,并且不带参数。

不,没有其他构造函数

A n();
被视为不带参数并返回
a
对象的函数声明。您可以通过以下代码看到这一点:

class A
{
public:
    int x;

public:

    A(){ std::cout << "Default constructor called for A\n";}

    A(int x){

        std::cout << "Argument constructor called for A\n";

        this->x = x;

    }
};


int main(int argc, char const *argv[])
{

    A m;
    A p(0);
    A n();
    n.x =3;

    return 0;
}
A类
{
公众:
int x;
公众:

A(){std::cout google“最麻烦的解析”这本身并不是一个错误,但如果您试图通过n访问A的方法,它将是一个错误。
class A
{
public:
    int x;

public:

    A(){ std::cout << "Default constructor called for A\n";}

    A(int x){

        std::cout << "Argument constructor called for A\n";

        this->x = x;

    }
};


int main(int argc, char const *argv[])
{

    A m;
    A p(0);
    A n();
    n.x =3;

    return 0;
}