Выбрать главу

Рассмотрим пример структуры со свойствами, подобными свойствам класса.

// Использование структуры для создания класса.

#include <iostream>

using namespace std;

struct cl {

  int get_i(); // Эти члены открыты (public)

  void put_i(int j); // по умолчанию.

 private:

  int i;

};

int cclass="underline" :get_i()

{

 return i;

}

void cclass="underline" :put_i(int j)

{

 i = j;

}

int main()

{

 cl s;

 s.put_i (10);

 cout << s.get_i();

 return 0;

}

В этой программе определяется тип структуры с именем cl, в которой функции-члены get_i() и put_i() являются открытыми (public), а член данных i — закрытым (private). Обратите внимание на то, что в структурах для объявления закрытых членов используется ключевое слово private.

Ключевое слово private используется для объявления закрытых членов класса.

В следующем примере показана эквивалентная программа, которая использует вместо типа struct тип class.

// Использование типа class вместо типа struct.

#include <iostream>

using namespace std;

class cl {

  int i; // закрытый член по умолчанию

 public:

  int get_i();

  void put_i(int j);

};

int cclass="underline" :get_i()

{

 return i;

}

void cclass="underline" :put_i(int j)

{

 i = j;

}

int main()

{

 cl s;

 s.put_i(10);

 cout << s.get_i();

 return 0;

}

Иногда С++-программисты к структурам, которые не содержат функции-члены, применяют термин POD-struct.

С++-программисты тип class используют главным образом для определения формы объекта, который содержит функции-члены, а тип struct — для создания объектов, которые содержат только члены данных. Иногда для описания структуры, которая не содержит функции-члены, используется аббревиатура POD (Plain Old Data).

Сравнение структур с классами

Тот факт, что и структуры, и классы обладают практически идентичными возможностями, создает впечатление избыточности. Многие новички в программировании на C++ недоумевают, почему в нем существует такое очевидное дублирование. Нередко приходится слышать предложения отказаться от ненужного ключевого слова (class или struct) и оставить только одно из них.

Ответ на эту цепь рассуждений лежит в происхождении языка C++ от С и намерении сохранить C++ совместимым снизу вверх с С. В соответствии с современным определением C++ стандартная С-структура одновременно является совершенно законной С++-структурой. В языке С, который не содержит ключевых слов public или private, все члены структуры являются открытыми. Вот почему и члены С++-структур по умолчанию являются открытыми (а не закрытыми). Поскольку конструкция типа class специально разработана для поддержки инкапсуляции, есть определенный смысл в том, чтобы по умолчанию ее члены были закрытыми. Следовательно, чтобы избежать несовместимости с языком С в этом вопросе, аспекты доступа, действующие по умолчанию, менять было нельзя, поэтому и решено было добавить новое ключевое слово. Но в перспективе можно говорить о более веской причине для отделения структур от классов. Поскольку тип class синтаксически отделен от типа struct, определение класса вполне открыто для эволюционных изменений, которые синтаксически могут оказаться несовместимыми с С-подобными структурами. Поскольку мы имеем дело с двумя отдельными типами, будущее направление развития языка C++ не обременяется "моральными обязательствами", связанными с совместимостью с С-структурами.