#include
using namespace std;
void f();
int main()
{
f () ;
// Класс myclass из этого не виден,
return 0;
}
void f ()
{
class myclass {
int i;
public:
void put_i(int n) { i=n; }
int get_i() { return i; }
} ob;
ob.put_i(10);
cout
}
Итог: 10;
Особенности локального класса:
- в локального класса возможно применять типы, статические (static) и внешние (extern) переменные, элементы перечислений и внешние функции из области, в которой он обрисован; запрещается применять автоматические переменные из данной области;
- локальный класс не имеет возможности иметь статических элементов;
- способы этого класса смогут быть обрисованы лишь в класса;
деструкторы и Конструкторы
Листинг 3. Пример класса стек с конструктором
//stack.h
#pragma once
#include
namespace stk{
//тип стека
typedef int DType;
class Stack{
DType *stck;
int top;
int size;
public:
//Конструктор
Stack(int s);
Stack(const Stack st);
~Stack();
// операции модификации стека
void push(const DType item);
DType pop();
void clear();
// доступ к стеку
DType peek (void) const;
int get_size() const { return size;}
// способы проверки стека
bool isEmpty() const;
bool isFull() const; // реализация массива
};
}
Пример реализации:
//stack.cpp
#include stack.h
namespace stk{
//Конструктор
Stack::Stack(int s)
{
top = -1;
stck = new DType[size];
size = s;
}
{
top = st.top;
size = st.size;
stck = new DType[size];
for(int i=0; i
stck[i] = st.stck[i];
}
Stack::~Stack()
{
delete [] stck;
}
void Stack::push(const DType item)
{
if (top == size-1){
std::cerr
return;
}
stck[++top] = item;
}
DType Stack::pop()
{
if (top == -1){
std::cerr
return 0;
}
return stck[top—];
}
void Stack::clear(void)
{
top = -1;
}
DType Stack::peek() const
{
if (top == -1)
{
std::cerr
exit(1);
}
return stck[top];
}
bool Stack::isEmpty() const
{
return top == -1;
}
bool Stack::isFull() const
{
return top == size-1;
}
}
Пример применении:
#include
#include stack.h
using namespace std;
int main(int argc, char *argv[])
{
stk::Stack st(5); // stk::Stack st = 5;
for (int i=0; i st.get_size(); i++){
st.push(i+1);
}
cout
stk::в один раз st2 = st;
for (int i=0; i st.get_size(); i++){
cout
cout
}
return 0;
}
Итог:
St: 5
St2: 5
St: 4
St2: 4
St: 3
St2: 3
St: 2
St2: 2
St: 1
St2: 1
Конструктор рекомендован для инициализации объекта и вызывается машинально при его создании:
Свойства:
- Конструктор не возвращает значения
- Конструктор возможно перегружать
- Конструктор, вызываемый без параметров, именуется конструктором по умолчанию.
- Параметры конструктора смогут иметь любой тип, также же класса.
- В случае, если программист не указал ни одного конструктора, компилятор формирует его машинально.
- Конструкторы не наследуются.
- Конструкторы нельзя описывать с модификаторами const. virtual и static.
- Конструкторы глобальных объектов вызываются до вызова функции main.
Синтаксис
Имя класса ([параметры]){}
Деструктор — это особенный вид способа, использующийся для освобождения памяти, занимаемой объектом. Деструктор вызывается машинально, в то время, когда объект выходит из области видимости:
• для локальных объектов — при выходе из блока, в котором они заявлены;
• для глобальных — как часть процедуры выхода из main:
• для объектов, заданных через указатели^ деструктор вызывается неявно при применении операции delete.
Имя деструктора начинается с тильды (~), за которой направляться имя класса.
Свойства:
- не имеет доводов и возвращаемого значения;
- не может быть заявлен как const либо static;
- не наследуется;
- возможно виртуальным
- В случае, если деструктор явным образом не выяснен, компилятор машинально формирует безлюдной деструктор.
Синтаксис
~Имя класса ([параметры){}
Конструктор копирования
Конструктор копирования — это особый вид конструктора, приобретающий в качестве единственного параметра указатель на объект этого же класса:
Имя класса (const Имя класса obj) {
//Тело конструктора
}
Конструктор копирования вызывается:
- при описании нового объекта с инициализацией вторым объектом;
- при передаче объекта в функцию по значению;
- при возврате объекта из функции^
Если не указано ни одного конструктора копирования, компилятор формирует его машинально. Таковой конструктор делает поэлементное копирование полей. В случае, если класс содержит указатели либо ссылки, это, вероятнее, будет неправильным, потому, что и копия, и оригинал будут показывать на одну и ту же область памяти.
Любой конструктор класса, принимающий один параметр какого-либо другого типа, именуется конструктором преобразования, потому, что он осуществляет преобразование из типа параметра в тип этого класса.