Рубрики

Статические члены данных в C ++

Предсказать вывод следующей программы на C ++:

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

};

  

int main()

{

    B b;

    return 0;

}

Выход:

B's Constructor Called

Вышеприведенная программа вызывает только конструктор B, но не вызывает конструктор A. Причина этого проста, статические члены объявляются только в объявлении класса, но не определяются. Они должны быть явно определены вне класса с помощью оператора разрешения области видимости .
Если мы попытаемся получить доступ к статическому члену «а» без его явного определения, мы получим ошибку компиляции. Например, следующая программа завершается неудачно при компиляции.

#include <iostream>

using namespace std;

  

class A

{

    int x;

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

};

  

int main()

{

    B b;

    A a = b.getA();

    return 0;

}

Выход:

Compiler Error: undefined reference to `B::a' 

Если мы добавим определение a, программа будет работать нормально и вызовет конструктор A. Смотрите следующую программу.

#include <iostream>

using namespace std;

  

class A

{

    int x;

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;  // определение

  

int main()

{

    B b1, b2, b3;

    A a = b1.getA();

  

    return 0;

}

Выход:

A's constructor called
B's constructor called
B's constructor called
B's constructor called

Обратите внимание, что вышеуказанная программа вызывает конструктор B 3 раза для 3 объектов (b1, b2 и b3), но вызывает конструктор A только один раз. Причина в том, что статические члены являются общими для всех объектов. Вот почему они также известны как члены класса или поля класса . Кроме того, к статическим элементам можно получить доступ без какого-либо объекта , см. Программу ниже, где статический элемент 'a' доступен без какого-либо объекта.

#include <iostream>

using namespace std;

  

class A

{

    int x;

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;  // определение

  

int main()

{

    // к статическому члену 'a' обращаются без объекта B

    A a = B::getA();

  

    return 0;

}

Выход:

A's constructor called

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Статические члены данных в C ++

0.00 (0%) 0 votes