在这个程序中“A的构造函数”正在打印2次。我怀疑为什么“A的构造函数”不是用
打印的A b = B::getA();
打印时用
打印A a;
在这两种情况下,我们都在创建一个新对象。
这是我的计划:
#include <iostream>
using namespace std;
class A
{
public:
A() { cout << "A's constructor called " << endl; }
};
class B
{
static A a;
public:
B() { cout << "B's constructor called " << endl; }
static A getA() { return a; }
};
A B::a; // definition of a
int main()
{
A a;
A b = B::getA();
return 0;
}
答案 0 :(得分:3)
在创建A
内的静态B
时,在程序启动时调用第一个构造函数。
当在堆栈上分配A时,在main
内调用第二个构造函数。
不再需要调用默认的A
构造函数。当您调用getA()
时,将使用复制构造函数,编译器将提供您未定义的复制构造函数。
答案 1 :(得分:2)
因为getA()
调用了一个你没有写过的复制构造函数,所以将调用默认值。
答案 2 :(得分:1)
A b = B::getA();
使用复制构造函数初始化b
。您只跟踪默认构造函数,此处未使用。如果您也想跟踪复制构造函数,那么您需要提供一个:
A(A const &) { cout << "A's copy constructor called " << endl; }
答案 3 :(得分:0)
用“静态A a”和“A B :: a”调用一个contructore,即作为B类成员的静态初始化
在C,C ++中执行程序期间,首先初始化所有全局变量和静态变量。