В этой программе "Конструктор с именем" печатает 2 раза. Я сомневаюсь, почему "конструктор под названием" не печатает с
A b = B::getA();
при печати
A a;
В обоих случаях мы создаем новый объект.
Вот моя программа:
#include <iostream>
using namespace std;
class A
{
public:
A() { cout << "A constructor called " << endl; }
};
class B
{
static A a;
public:
B() { cout << "B constructor called " << endl; }
static A getA() { return a; }
};
A B::a; // definition of a
int main()
{
A a;
A b = B::getA();
return 0;
}
Первый конструктор вызывается при запуске программы, когда A
статический A
внутри B
Второй конструктор вызывается внутри вашей main
когда A выделяется в стеке.
Больше вызовов для конструктора A
по умолчанию больше нет. Когда вы вызываете getA()
, будет использоваться конструктор копирования, который, как вы еще не определили, будет предоставлен компилятором.
Потому что getA()
вызывает конструктор копирования, который вы не написали, поэтому будет вызываться по умолчанию.
A b = B::getA();
Это инициализирует b
используя конструктор копирования. Вы только отслеживаете конструктор по умолчанию, который здесь не используется. Если вы также хотите проследить конструктор копирования, вам нужно будет указать один:
A(A const &) { cout << "A copy constructor called " << endl; }
один contructore вызывается со "статическим A a" и "AB :: a", т.е. статической инициализацией a, являющейся членом класса B
во время выполнения программы в C, C++ все глобальные и статические переменные сначала инициализируются.