为什么构造函数没有被调用

时间:2013-11-21 12:18:23

标签: c++ static

在这个程序中“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;
}

4 个答案:

答案 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 ++中执行程序期间,首先初始化所有全局变量和静态变量。