Классы, структуры и объединения в С++

Синтаксически класс похож на структуру. Класс и структура имеют фактически одинаковые свойства. В C++ определение структуры расширили таким образом, что туда, как и в определение класса, удалось включить функции-члены, в том числе конструкторы и деструкторы. Таким образом, единственным отличием между структурой и классом является то, что члены класса, по умолчанию, являются закрытыми, а члены структуры — открытыми.

Пример. Для создания класса используется ключевое слово 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;
}
Пример. Использование объединения для побайтного вывода значения типа double в двоичном представлении:
#include 
using 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;
}
Пример. Для побайтного вывода на экран значения типа double используется анонимное объединение. (Предполагается, что длина значения типа double равна восьми байтам.).

Доступ к переменным value и bytes осуществляется так, как если бы они были не частью объединения, а обычными переменными. Несмотря на то, что эти переменные объявлены как часть анонимного объединения, их имена находятся в той же области видимости, что и другие объявленные здесь локальные переменные. Именно по этой причине член анонимного объединения не может иметь то же имя, что и любая переменная в данной области видимости.
// Использование анонимного объединения
#include 
using 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;
}
Онлайн всего: 2
Гостей: 2
Пользователей: 0

STUDLAB Сообщить про опечатку на сайте