використовується для конструювання значень з типом його класу. За допомогою конструктора можна створювати нові об'єкти його типу, використовуючи синтаксис
typedef-ім'я ( список_параметрів opt )
Наприклад
complex zz = complex (1,2.3);
cprint (complex (7.8,1.2));
Об'єкти, створені таким чином, не мають імені (якщо конструктор не використаний як ініціалізація, як це було з zz вище), і їх час життя обмежений областю видимості, в якій вони створені. Вони не можуть розглядатися як константи їх типу.
Якщо клас має конструктор, то він викликається для кожного об'єкту цього класу перед тим, як цей об'єкт буде як-небудь використаний;
Конструктор може бути overload, але не virtual або friend.
Якщо клас має базовий клас з конструктором, то конструктор для базового класу викликається до виклику конструктора для похідного класу. Конструктори для об'єктів членів, якщо такі є, виконуються після конструктора базового класу і до конструктора об'єкту, що містить їх.
2.7 Перетворення
Конструктор, одержуючий один параметр, визначає перетворення з типу свого параметра в тип свого класу. Такі перетворення неявно застосовуються додатково до звичних арифметичних перетворень. Тому привласнення об'єкту з класу X допустиме, якщо або привласнюване значення є X, або якщо X має конструктор, який набуває привласнюване значення як свій єдиний параметр. Аналогічно конструктори використовуються для перетворення параметрів функції і ініціалізацій. Наприклад:
class X { ... X (int); };
f (X arg)
{
X а = 1; /* а = X (1) */
а = 2; /* а = X (2) */
f (3); /* f (X (3)) */
}
Якщо для класу X не знайдений жоден конструктор, що приймає
привласнюваний тип, то не робиться ніяких спроб відшукати конструктор для перетворення привласнюваного типу в тип, який міг би бути прийнятний для конструкторів класу X. Наприклад:
class X { ... X (int); };
class X { ... Y (X); };
Y а = 1; /* неприпустимо: Y (X (1)) не пробується */
2.8 Структури
Структура є клас, всі члени якого загальні. Це значить, що
struct s { ... };
еквівалентно
class s { public: ... };
Структура може мати функції-члени (включаючи конструктори і деструктори).
2.9 Об'єднання
Об'єднання можна вважати структурою, всі об'єкти-члени якої починаються із зсуву 0, і розмір якої достатній для змісту будь-якого з її об'єктів-членів. В кожний момент часу в об'єднанні може берегтися не більше одного з об'єктів-членів. Об'єднання може мати функції-члени (включаючи конструктори і деструктори).
2.10 Вкладені класи
Клас може бути описаний усередині іншого класу. В цьому випадку область видимості імен внутрішнього класу його і загальних імен обмежується охоплюючим класом. За винятком цього обмеження допустимо, щоб внутрішній клас вже був описаний зовні охоплюючого класу. Опис одного класу усередині іншого не впливає на правила доступу до закритих членів і не поміщає функції-члени внутрішнього класу в область видимості охоплюючого класу. Наприклад:
int x;
class enclose /* охоплюючий */
{
int x;
class inner
{
int у;
f () { x=1 }
...
};
g (inner*);
...
};
int inner; /* вкладений */
enclose.g (inner* p) { ... }
У даному прикладі x в f посилається на x, описаний перед класом enclose. Оскільки у є закритим членом inner, g не може його використовувати. Оскільки g є членом enclose, імена використані в g, вважаються тими, що знаходяться в області видимості класу enclose. Тому inner в описі параметрів g відноситься до охопленому типу inner, а не до int.
2.11 Класові об'єкти
Об'єкт із закритими членами не може бути ініціалізований за допомогою простого привласнення; це ж відноситься до об'єкту об'єднання. Якщо клас має конструктор, не одержуючий значень, то цей конструктор використовується для об'єктів, які явно не ініціалізувалися.
Параметри для конструктора можуть бути також представлені у вигляді взятого в круглі дужки списку. Наприклад:
struct complex
{
float re;
float im;
complex (float r,float i) { re=r; im=i; }
complex (float r) { re=r; im=0; }
};
complex zz (1,2.3);
complex* zp = new complex (1,2.3);
Ініціалізація може бути також виконана за допомогою явного привласнення; перетворення проводяться. Наприклад
complex zz1 = complex (1,2.3);
complex zz2 = complex (123);
complex zz3 = 123;
complex zz4 = zz3;
Якщо конструктор посилається на об'єкт свого власного класу, то він викликатиметься при ініціалізації об'єкту іншим об'єктом цього класу, але не при ініціалізації об'єкту конструктором.
Об'єкт класу, що має конструктори, може бути членом складового об'єкту тільки якщо він сам не має конструктора або якщо його конструктори не мають параметрів. В останньому випадку конструктор викликається при створенні складового об'єкту. Якщо член складового об'єкту є членом класу з деструктором, то цей деструктор викликається при знищенні складового об'єкту.
3 ТЕКСТ ПРОГРАМИ
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#define FNAME "f:\listFileInDisk.txt"
#define Fname2 "f:\ListFreeSpese.txt"
class file
{
char Fname[30];
int pBegin;
long int size;
long int sizeFreeSpase;
bool statusFile;
public:
file()
{
cout<<"input file name :";
cin>>Fname;
cout<<"input size file :";
cin>>size;
};
void writeFile();
void delFile();
void show();
};
FILE *f,*s;
char fname[]=FNAME,f2name[]=Fname2;
void main ()
{
file a=file();
a.writeFile();
a.delFile();
a.show();
getch();
}
void file::writeFile()
{
if((f=fopen(fname,"at"))==NULL)
{
cout<<"error open file";
getch();
return;
}
if ((s=fopen(f2name,"r+"))==NULL)
{
cout<<"error open fileFreespese";
getch();
return;
}
char st[30];
int Poz;
fscanf(s,"%s%i%i",st,&pBegin,&sizeFreeSpase);
Poz=ftell(s);
if(sizeFreeSpase<size)
{
cout<<"is'nt spase in disk";
getch();
return;
}
sizeFreeSpase-=size;
fprintf(f,"%s\t%i\t%i\t%i\n",Fname,pBegin,size,1);
pBegin+=size;
fseek(s,9,SEEK_SET);
fprintf(s,"%i\t%i ",pBegin,sizeFreeSpase);
fclose(s);
fclose(f);
};
void file::delFile()
{
char file[30];
int P;
if((f=fopen(fname,"r+"))==NULL)
{
cout<<"error oopen file";
getch();
return;
};
if((s=fopen(f2name,"at"))==NULL)
{
cout<<"error open fileFreeSpase";
getch();
return;
};
cout<<"input name file:";
cin>>file;
while(!feof(f))
{
P=ftell(f);
fscanf(f,"%s%i%i%i%",Fname,&pBegin,&size,&statusFile);
if(!strcmp(file,Fname))
{
fseek(f,P,SEEK_SET);
fprintf(f,"%s\t%i\t%i\t%i\n",Fname,pBegin,size,0);
fprintf(s,"\n%s\t%i\t%i",Fname,pBegin,size);
break;
}
}
fclose(f);
};
void file::show()
{
if((f=fopen(fname,"r+"))==NULL)
{
cout<<"error oopen file";
getch();
return;
}