Доступ к приватным членам класса 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Доступ к приватным членам класса



Для того, чтобы иметь доступ к приватным данным, нужно написать функцию члена, которая будет возвращать значение члена данных.

Class Box

{

Private:
double L,H,W;

Public:

Box(double fr=1.0, double hv=1.0, double bv=1.0

{ cout<<”Constructor called\n”;

L=lv;H=hv;W=bv;}
double Volume() {return L*H*W;}

Double Get_lenght();

Inline double Box::Get_length(){return L;}

};

Int main()

{

Box matchbox(1.5,2.5,2.0);

Box box1(matchbox);

Double V=box1.volume();

Cout<<”the volume of box1=”<<V/box1.Get_lenght()<<endl;

Cout<<”the volume of matchbox=”<< matchbox.volume()<<endl;

Return 0;

}

 

Дружественные функции

Бывают случаи, когда по некоторым причинам необходимо, чтобы некоторые функции, не являющиеся членом класса, имели доступ к приватным членам функции. Такие функции называются дружественными функциями класса и определяются с помощью ключевого слова friend. В самом классе можно либо указать прототип дружественной функции, либо целиком ее определение. Так как дружественные функции не являются членами класса, то атрибуты доступа не относятся к ней. Это класс функций с некоторыми привилегиями (есть доступ ко всем членам класса), которыми не могут пользоваться обычные глобальные.

Примечание: в соответствии с используемым нами стилем программирования, дружественная функция должна быть описана в конце класса.

Пример:

Создадим дружественную функцию, которая будет возвращать сумму поверхностей ящика.

 

Class Box

{

Private:
double L,H,W;

Public:

Box(double fr=1.0, double hv=1.0, double bv=1.0

{ cout<<”Constructor called\n”;

L=lv;H=hv;W=bv;}
double Volume() {return L*H*W;}

Double Get_lenght();

Inline double Box::Get_length(){return L;}

Friend double BoxSurface(Box aBox);

};

Double BoxSurface(Box aBox);

Return 2*(aBox.L* aBox.H+ aBox.L* aBox.W+ aBox.H* aBox.W)

Int main()

{

Box matchbox(1.5,2.5,2.0);

Box box1(matchbox);

Double V=box1.volume();

Cout<<”the volume of box1=”<<V/box1.Get_lenght()<<endl;

Cout<<”the volume of matchbox=”<< matchbox.volume()<<endl;

Return 0;

}

 

Интересным применением указателя this является недопущения присваивания самому себе. В дальнейшем мы увидим, что присваивание объекта самому себе может вызвать серьезные ошибки, если объекты содержат указатели на выделенную динамическую память.

Статические члены класса

 

Double sum (double a, double b)

{ static int count=0;

Count++;

Cout<<”this function has been called ”<<count<<”times”<<endl;

return a+b;}

int main()

{

Sum(5.0,5.0);

Sum(5.0,5.0);

Return 0;

}

 

Статические члены класса

Статические данные-члены

Статические функции-члены

 

Статические данные-члены дают такой эффект, что они создаются в единственном экземпляре и разделяются всем объектами класса.

Обычные данные-члены создаются в виде копии для каждого объекта. Но для всего класса имеется только по одному экземпляру каждого статического члена независимо от того, сколько объектов этого класса было определено.

Static int count; - статическая переменная, по умолчанию имеет значение 0, существует во время выполнения всей программы. Локальные же имеют по умолчанию «мусорное» значение, существуют только в своем блоке программы.

Одним из практических применений статических переменных является подсчет количества вызовов функции.

Double sum (double a, double b)

{

static int count;

Count++;

Cout<<”sum was been called ”<<count<<” times”<<endl;

Return a+b;

}

Int main()

{

sum (5,3);

Sum(10,3);

Return 0;

}

 

Class Box

{

Public:

Static int count;

Private:

Double L,H,W;};

 

Одним из практичских применений статических переменных является подсчет существующих объектов класса. Для этого его нужно поместить в общедоступный раздел класса.

Как инициализировать данный объект класса?

Нельзя инициализировать в самом классе, т.к. класс общая модель для создания любого объекта класса. Мы не можем его инициализировать в конструкторе т.к. мы желаем его значения увеличивать при каждом вызове конструктора для создания объектов.

Мы не можем инициализировать его в другом функции-члене, т.к. она будет ассоциироваться с объектом, а инициализация этого статического члена нужна для любого объекта. Значит статический данный-член нужно инициализировать вне класса с помощь оператора int Box::count=0;

Class Box

{

Public:

Static int count;

Box(double pv, double hv=1.0, double bv=1.0)

{ cout <<”constructor called”;

L=H=W=1.0;

Count++;}

 

Couble Volume() {return L*H*W;}

Private:

Double L,H,W;

};

 

Int Box::count=0;

 

Int main()

{

Box boxes[5];

Box cigar (2.0, 5.0, 1.0);

Cout<<”\n\n Number of objects (through class)=”<<box.count<<endl;

Cout<<”\n\n Number of objects (through object)=”<<boxes[2].count<<endl;

Return 0;

}йомахарт ймасоул nhgjhygjuloilhgbg

 

Статические члены класса существуют, даже если никаких объектов не было создано и это очевидно из того, что они инициализируются до того, как объявлен любой объект класса. Статические данные члены создаются автоматически при запуске программы и инициализируются нулем, если только мы не инициализируем их другим значением.

 

Статические функции-члены класса.

Объявляя функцию-член класса как статическую, мы делаем ее независимой от любого конкретного объекта класса. Обращения членам класса из статической функции члена должно выполняться с использованием квалифицированных имен.

Статическая функция-член обладает таким преимуществом, что она существует и может быть вызвана даже тогда, когда еще не существует ни одного объекта данного класса. В этом случае в ней могут использоваться только статические данные члены класса, поскольку на этот момент только они и существуют.

Таким образом, статическая функция-член может быть вызвана для проверки статических данных-членов, даже если мы не знаем, существуют ли объекты этого класса и если они существуют, то сколько. Статическая функция-член может обращаться как к приватным, так и к общедоступным членам класса.

Static int Function(int N);

aBox.Function(5);

Box::Function(5);

Массив объекта

Массив может хранить объекты любого типа, как встроенного, так и собственного пользовательского типа. При объявлении массива компилятору сообщают количество хранимых объектов (размер массива), что позволит выделить участок памяти требуемого размера и тип объекта. Для того, чтобы объекты могли быть созданы при определении массива, класс должен обладать конструктором по умолчанию без параметров. Для обращения к членам массива сначала используется операция индексации ([..]), а затем, с помощью операции прямого доступа, получают доступ к определенному члену класса. Количество выделенной памяти для всего массива, компьютер выделяет на основании типа.

 

Int main()

{

Box boxes[5];

Box cigar(8.0,5.0,1.0);

Boxes[3]=cigar;

Cout<<”the volume of boxes[1]= “<<boxes[1].Volume()<<endl;

Cout<<”the volume of boxes[4]= “<<boxes[4].Volume()<<” =”Volume of cigar= “<<cigar.Volume()<<endl;

Return 0;

}

 

Деструкторы

Деструктор – функция, которая уничтожает объект, когда необходимость в нем отпадает или когда он выходит из области видимости. Разрушение объектов включает освобождение памяти, занятой данными членами объекта, за исключением статических членов, которые продолжают существовать. Даже когда не остается ни одного экземпляра класса. Деструктор – особая функция, имя которой совпадает с именем класса, но предваренное символом ~(тильда). Деструктор не возвращает значения (не имеет типа возврата) и не принимает параметров, следовательно его невозможно перегружать и он может быть в классе только один.

 

Class Box

{public:

~Box(){cout<<”destructor called/n”;}

Box(double lv=1.0, double hv=1.0, double bv=1.0)

{L=lv;H=hv;W=bv;

Cout<<”constructor called\n”;}

Double Volume(){return L*H*W;}

Private:

Double L,H,W;

};

Int main()

{ Box boxes[5]

Box cigar(8.0,5.0,1.0);

Box match(2.2,1.1,0,5);

Box* PB1=&cigar;

Box* PB2=Null;

Cout<<endl<<”the cigar Volume= ”<<PB1->Volume()<<endl;

PB2=boxes;

Boxes[2]=match;

Cout<<”the volume of boxes[2]= “<<(PB+2)->Volume()<<endl;

Return0;

}

Замечание:

При присваивании указателю PB2 массива boxes, происходит передача адреса первого элемента массива boxes.

При вызове Volume(), для выбора необходимого нам 3-го элемента массива, мы можем просто прибавить к нашей позиции(1-й элемент) еще 2 позиции и получим 3-й элемент.



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 125; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.140.242.165 (0.016 с.)