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;
}