Классы, структуры и объединения в С++
Синтаксически класс похож на структуру. Класс и структура имеют фактически одинаковые свойства. В C++ определение структуры расширили таким образом, что туда, как и в определение класса, удалось включить функции-члены, в том числе конструкторы и деструкторы. Таким образом, единственным отличием между структурой и классом является то, что члены класса, по умолчанию, являются закрытыми, а члены структуры — открытыми.
Пример. Для создания класса используется ключевое слово struct:
Пример. Использование объединения для побайтного вывода значения типа double в двоичном представлении:
Результат работы программы
Пример. Для побайтного вывода на экран значения типа double используется анонимное объединение. (Предполагается, что длина значения типа double равна восьми байтам.).
Доступ к переменным value и bytes осуществляется так, как если бы они были не частью объединения, а обычными переменными. Несмотря на то, что эти переменные объявлены как часть анонимного объединения, их имена находятся в той же области видимости, что и другие объявленные здесь локальные переменные. Именно по этой причине член анонимного объединения не может иметь то же имя, что и любая переменная в данной области видимости.
Пример. Для создания класса используется ключевое слово struct:
include#include using namespace std; // использование структуры для определения типа класса struct st_type { st_type(double b, char *n); void show(); private: double balance; char name[40]; }; st_type::st_type(double b, char *n) { balance = b; strcpy(name, n); } void st_type::show() { cout << "Имя:" << name; cout << ":$" << balance; if(balance < 0.0) cout << "***"; cout << "\n"; } int main() { st_type acc1(100.12, "Johnson"); st_type acc2(-12.34, "Hedricks"); acc1.show(); acc2.show(); return 0; }
#includeusing namespace std; union bits { bits(double n); void show_bits(); double d; unsigned char c[sizeof (double)]; }; bits::bits(double n) { d = n; } void bits::show_bits() { int i, j; for( j = sizeof (double) - 1; j >= 0; j --) { cout << "Двоичное представление байта" << j << ":"; for( i = 128; i; i >>= 1) if(i & c[ j ]) cout << "1"; else cout << "0"; cout << "\n"; } } int main() { bits ob(1991.829); ob.show_bits(); return 0; }
Двоичное представление байта 7: 01000000 Двоичное представление байта 6: 10011111 Двоичное представление байта 5: 00011111 Двоичное представление байта 4: 01010000 Двоичное представление байта 3: 11100101 Двоичное представление байта 2: 01100000 Двоичное представление байта 1: 01000001 Двоичное представление байта 0: 10001001Пример. Структуры и объединения могут иметь конструкторы и деструкторы. В следующем примере класс strtype переделан в структуру. В структуре имеются конструктор и деструктор.
#include#include #include using namespace std; struct strtype { strtype(char *ptr); ~strtype(); void show(); private: char *p; int len; }; strtype::strtype(char *ptr) { len = strlen(ptr); p = (char *) malloc(len + 1); if(!p) { cout << "Ошибка выделения памяти\n"; exit(1); } strcpy(p, ptr); } strtype::~strtype() { cout << "Освобождение p\n"; free(p); } void strtype::show() { cout << p << "- длина: " << len; cout << "\n"; } int main() { strtype s1("Это проверка"), s2("Мне нравится С++"); s1.show(); s2.show(); return 0; }
Доступ к переменным value и bytes осуществляется так, как если бы они были не частью объединения, а обычными переменными. Несмотря на то, что эти переменные объявлены как часть анонимного объединения, их имена находятся в той же области видимости, что и другие объявленные здесь локальные переменные. Именно по этой причине член анонимного объединения не может иметь то же имя, что и любая переменная в данной области видимости.
// Использование анонимного объединения #includeusing namespace std; int main() { union { unsigned char bytes[8]; double value; }; int i; value = 859345.324; // побайтный вывод значения типа double for(i=0; i<8; i++) cout << (int) bytes[i] << " "; return 0; }