Переменные и члены класса, объявленные с модификатором доступа static, называются статическими членами класса. Cтатические переменные и методы доступны без создания объекта данного класса. Имя статической переменной квалифицируется именем класса с использованием операции принадлежности :: , а не именем экземпляра класса.
Например:
class A { public: static int iStat; };
int main(int argc, char* argv[]) {
A:: iStat = 123;
}
Статические методы могут вызывать и использовать только другие статические методы и статические переменные. Из статического метода нельзя выполнять вызов не статического метода - члена класса.
Статическую переменную можно рассматривать как аналог глобальной переменной, которая связана с конкретным классом.
Часто статические переменные называют переменными класса, а не статические переменные -
Для статических переменных могут использоваться указатели.
Например:
class A
{ public:
static int iStatVar;
};
int main(int argc, char* argv[]){
int A:: iStatVar = 0;
int *piStatVar = A:: iStatVar;
}
При использовании статических переменных указатели всегда являются указателями на существующий тип (в данном примере на тип int ), а не на тип класса.
Для того чтобы создать и использовать статическую переменную, следует:
Например: static int iStat;.
Например: int A::iStat;
int имеет значение 0 ).Например: A::iStat=123;
Инициализацию статической переменной можно выполнять в теле конструктора в том случае, если при создании объекта с использованием этого конструктора память под статическую переменную уже выделена. Однако инициализировать статическую переменную через конструктор в форме
имя_класса::имя_конструктора :
имя_стат_переменной(значение) { }
нельзя ни в каком случае.
Для того чтобы создать статический метод - член класса в среде Visual C++, достаточно выделить в окне Class View секцию с именем класса, в который будет вставлен создаваемый метод, и выполнить команду контекстного меню Add|Add Function. А затем определить тип и имя создаваемого метода, список параметров, и отметить флажок Static, указывающий на то, что создаваемая функция будет статической.
В результате выполненных действий среда Visual C++ добавит в заголовочный файл класса прототип создаваемой статической функции, а в файл реализации - код реализации создаваемой статической функции.
Например:
class A
{public:
a1(void);
~a1(void);
int Fx1(int i1);
int Fx2(int i2);
protected:
static int Fstat1(void);
// Статическая функция доступна
//только для статических методов - членов
//данного класса и наследуемых классов
public:
static int Fstat2(void);
// Общедоступная статическая функция
};
int main(int argc, char* argv[]){
std::cout<<a1::Fstat2();
// Вызов статической функции
}
Реализация статической функции записывается так же, как и реализация любого другого метода - члена класса. При этом ключевое слово static не указывается.
Например:
int A::FStat1(void) { return 0; }
Виртуальные методы объявляются в базовом классе с ключевым словом virtual, а в производном классе могут быть переопределены. Прототипы виртуальных методов как в базовом, так и в производном классе должны быть одинаковы.
Применение виртуальных методов позволяет реализовывать механизм позднего связывания, при котором определение вызываемого метода происходит на этапе выполнения, а не на этапе компиляции. При этом вызываемый виртуальный метод зависит от типа объекта, для которого он вызывается. При раннем связывании, используемом для не виртуальных методов, определение вызываемого метода происходит на этапе компиляции.
На этапе компиляции строится таблица виртуальных методов, а конкретный адрес проставляется уже на этапе выполнения.
При вызове метода с использованием указателя на класс действуют следующие правила:
В следующем примере иллюстрируется вызов виртуальных методов:
class A // Объявление базового класса
{ public:
virtual void VirtMetod1(); // Виртуальный метод
void Metod2(); // Не виртуальный метод
};
void A::VirtMetod() { cout << "Вызван A::VirtMetod1\n";}
void A::Metod2() { cout << "Вызван A::Metod2\n"; }
class B : public A // Объявление производного класса
{public:
void VirtMetod1(); // Виртуальный метод
void Metod2(); // Не виртуальный метод
};
void B::VirtMetod1() { cout << "B::VirtMetod1\n";}
void B::Metod2() { cout << "B::Metod2\n"; }
void main() {
B aB; // Объект класса B
B *pB = aB; // Указатель на объект класса B
A *pA = aB; // Указатель на объект класса A
pA->VirtMetod1(); // Вызов метода VirtMetod класса B
pB->VirtMetod1(); // Вызов метода VirtMetod класса B
pA->Metod2(); // Вызов метода Metod2 класса A
pB->Metod2(); // Вызов метода Metod2 класса B
}
Результатом выполнения этой программы будут следующие строки:
Вызван B::VirtMetod1 Вызван B::VirtMetod1 Вызван A::Metod2 Вызван B::Metod2
Чисто виртуальной функцией называется виртуальная функция, указанная с
=0.
Например:
virtual void F1( int) =0;
Объявление класса может содержать
Например:
class A{
public:
A();
A (const A);
virtual A* virt_object1 () {
return new A();
}
virtual A* virt_object2 () {
return new A(*this);
}
}
Для того чтобы при множественном наследовании один и тот же базовый класс не порождал для объекта производного класса несколько объектов базового класса, при объявлении производного класса такой базовый класс указывается с ключевым словом virtual и называется виртуальным классом.
Например:
class A : virtual public B { }
Абстрактным классом называется класс, который содержит хотя бы одну чисто виртуальную функцию.
Абстрактный класс не может быть явно использован для создания объектов.
Как правило, абстрактный класс применяется для описания интерфейса, который должен быть реализован всеми его производными классами.
Если класс, производный от абстрактного класса, не содержит реализации всех его чисто виртуальных функций, то он также является абстрактным классом.
Шаблоны методов позволяют описывать одинаковую реализацию для различных типов параметров.
Шаблон метода позволяет описать одну реализацию метода для всех допустимых значений параметров. Фактически шаблон метода заменяет набор перегружаемых методов с различными типами параметров.
Шаблон метода - это еще одно проявление полиморфизма языка С++.
Шаблоны методов используют в качестве параметра тип переменной.
В момент компиляции при вызове метода, не имеющего прототипа, выполняется поиск шаблона метода, из которого вызываемый метод может быть сгенерирован.
Шаблон метода указывается ключевым словом template, за которым в угловых скобках указывается список типов, используемых для параметров функции и типа возвращаемого значения.
Например:
template <class T1>
T1 Fx (T1 x, T1 y) {return x+y;}
При использовании шаблона компилятор заменит для вызываемого метода тип шаблона на тип, указанный при вызове метода ( T1 на int в следующем примере).
Например:
int i1=1; int i2=2; std::cout<<Fx(i1,i2);
Шаблоны классов позволяют определить параметризированный тип.
Шаблоны классов аналогично шаблонам функций позволяют на этапе компиляции создавать определения классов.
Шаблон класса указывается ключевым словом template, за которым в угловых скобках указывается список типов для создания параметризированного класса. Имя шаблона класса указывается после ключевого слова class.
Для создания объекта на основе шаблона класса после имени шаблона в угловых скобках указывается конкретный тип:
имя_шаблона_класса <тип> имя_объекта.
Например:
template <class T1> // Описание шаблона класса
class A
{
T1 x,y;
public:
A();
~A();
T1 Fx();
void Fy(T1 a, T1 b);
};
template <class T1> A< T1>::A() {} // Реализация методов шаблона класса
template <class T1> A< T1>::~A() {}
template <class T1>T1 A< T1>::Fx(){ return x*y;}
template <class T1>void A< T1>::Fy(T1 a, T1 b) {x=a; y=b;}
int main(int argc, char* argv[])
{ int i1=1;
int i2=2;
double x=1.5;
double y=2.5;
A <int> F1; // Создание объекта с использованием шаблона класса
A <int> *pF1=F1; // Указатель на объект параметризированного типа
pF1->Fy(i1,i2);
std::cout<<pF1->Fx()<<std::endl;
A <double> F2;
A <double> *pF2=F2;
pF2->Fy(x,y);
std::cout<<pF2->Fx()<<std::endl;
return 0;
}
Свободная память, которую можно заказывать в процессе выполнения программы, называется динамической памятью. Для выделения непрерывного блока памяти можно использовать функцию malloc(), а для освобождения - функцию free(). Прототипы этих функций расположены в заголовочном файле stdlib.h.
Например:
int *pIntBuffer; // Выделение памяти под 5 переменных типа int pIntBuffer=malloc(5*sizeof(int));
При отсутствии требуемого количества памяти функция malloc возвращает значение null.
Выделение динамической памяти также можно выполнять оператором new, а освобождение - оператором delete. Оператор new автоматически учитывает тип объекта и выделяет требуемое количество памяти.
Пример:
double *pBuffer; // Выделение памяти под 10 переменных типа double pBuffer=new double [10];
Переменные и члены класса, объявленные с модификатором доступа static, называются статическими членами класса. Cтатические переменные и методы доступны без создания объекта данного класса. Имя статической переменной квалифицируется именем класса с использованием операции принадлежности :: , а не именем экземпляра класса.
Например:
class A { public: static int iStat; };
int main(int argc, char* argv[]) {
A:: iStat = 123;
}
Статические методы могут вызывать и использовать только другие статические методы и статические переменные. Из статического метода нельзя выполнять вызов не статического метода - члена класса.
Статическую переменную можно рассматривать как аналог глобальной переменной, которая связана с конкретным классом.
Часто статические переменные называют переменными класса, а не статические переменные -
Для статических переменных могут использоваться указатели.
Например:
class A
{ public:
static int iStatVar;
};
int main(int argc, char* argv[]){
int A:: iStatVar = 0;
int *piStatVar = A:: iStatVar;
}
При использовании статических переменных указатели всегда являются указателями на существующий тип (в данном примере на тип int ), а не на тип класса.
Для того чтобы создать и использовать статическую переменную, следует:
Например: static int iStat;.
Например: int A::iStat;
int имеет значение 0 ).Например: A::iStat=123;
Инициализацию статической переменной можно выполнять в теле конструктора в том случае, если при создании объекта с использованием этого конструктора память под статическую переменную уже выделена. Однако инициализировать статическую переменную через конструктор в форме
имя_класса::имя_конструктора :
имя_стат_переменной(значение) { }
нельзя ни в каком случае.
Для того чтобы создать статический метод - член класса в среде Visual C++, достаточно выделить в окне Class View секцию с именем класса, в который будет вставлен создаваемый метод, и выполнить команду контекстного меню Add|Add Function. А затем определить тип и имя создаваемого метода, список параметров, и отметить флажок Static, указывающий на то, что создаваемая функция будет статической.
В результате выполненных действий среда Visual C++ добавит в заголовочный файл класса прототип создаваемой статической функции, а в файл реализации - код реализации создаваемой статической функции.
Например:
class A
{public:
a1(void);
~a1(void);
int Fx1(int i1);
int Fx2(int i2);
protected:
static int Fstat1(void);
// Статическая функция доступна
//только для статических методов - членов
//данного класса и наследуемых классов
public:
static int Fstat2(void);
// Общедоступная статическая функция
};
int main(int argc, char* argv[]){
std::cout<<a1::Fstat2();
// Вызов статической функции
}
Реализация статической функции записывается так же, как и реализация любого другого метода - члена класса. При этом ключевое слово static не указывается.
Например:
int A::FStat1(void) { return 0; }
Виртуальные методы объявляются в базовом классе с ключевым словом virtual, а в производном классе могут быть переопределены. Прототипы виртуальных методов как в базовом, так и в производном классе должны быть одинаковы.
Применение виртуальных методов позволяет реализовывать механизм позднего связывания, при котором определение вызываемого метода происходит на этапе выполнения, а не на этапе компиляции. При этом вызываемый виртуальный метод зависит от типа объекта, для которого он вызывается. При раннем связывании, используемом для не виртуальных методов, определение вызываемого метода происходит на этапе компиляции.
На этапе компиляции строится таблица виртуальных методов, а конкретный адрес проставляется уже на этапе выполнения.
При вызове метода с использованием указателя на класс действуют следующие правила:
В следующем примере иллюстрируется вызов виртуальных методов:
class A // Объявление базового класса
{ public:
virtual void VirtMetod1(); // Виртуальный метод
void Metod2(); // Не виртуальный метод
};
void A::VirtMetod() { cout << "Вызван A::VirtMetod1\n";}
void A::Metod2() { cout << "Вызван A::Metod2\n"; }
class B : public A // Объявление производного класса
{public:
void VirtMetod1(); // Виртуальный метод
void Metod2(); // Не виртуальный метод
};
void B::VirtMetod1() { cout << "B::VirtMetod1\n";}
void B::Metod2() { cout << "B::Metod2\n"; }
void main() {
B aB; // Объект класса B
B *pB = aB; // Указатель на объект класса B
A *pA = aB; // Указатель на объект класса A
pA->VirtMetod1(); // Вызов метода VirtMetod класса B
pB->VirtMetod1(); // Вызов метода VirtMetod класса B
pA->Metod2(); // Вызов метода Metod2 класса A
pB->Metod2(); // Вызов метода Metod2 класса B
}
Результатом выполнения этой программы будут следующие строки:
Вызван B::VirtMetod1 Вызван B::VirtMetod1 Вызван A::Metod2 Вызван B::Metod2
Чисто виртуальной функцией называется виртуальная функция, указанная с
=0.
Например:
virtual void F1( int) =0;
Объявление класса может содержать
Например:
class A{
public:
A();
A (const A);
virtual A* virt_object1 () {
return new A();
}
virtual A* virt_object2 () {
return new A(*this);
}
}
Для того чтобы при множественном наследовании один и тот же базовый класс не порождал для объекта производного класса несколько объектов базового класса, при объявлении производного класса такой базовый класс указывается с ключевым словом virtual и называется виртуальным классом.
Например:
class A : virtual public B { }
Абстрактным классом называется класс, который содержит хотя бы одну чисто виртуальную функцию.
Абстрактный класс не может быть явно использован для создания объектов.
Как правило, абстрактный класс применяется для описания интерфейса, который должен быть реализован всеми его производными классами.
Если класс, производный от абстрактного класса, не содержит реализации всех его чисто виртуальных функций, то он также является абстрактным классом.
Шаблоны методов позволяют описывать одинаковую реализацию для различных типов параметров.
Шаблон метода позволяет описать одну реализацию метода для всех допустимых значений параметров. Фактически шаблон метода заменяет набор перегружаемых методов с различными типами параметров.
Шаблон метода - это еще одно проявление полиморфизма языка С++.
Шаблоны методов используют в качестве параметра тип переменной.
В момент компиляции при вызове метода, не имеющего прототипа, выполняется поиск шаблона метода, из которого вызываемый метод может быть сгенерирован.
Шаблон метода указывается ключевым словом template, за которым в угловых скобках указывается список типов, используемых для параметров функции и типа возвращаемого значения.
Например:
template <class T1>
T1 Fx (T1 x, T1 y) {return x+y;}
При использовании шаблона компилятор заменит для вызываемого метода тип шаблона на тип, указанный при вызове метода ( T1 на int в следующем примере).
Например:
int i1=1; int i2=2; std::cout<<Fx(i1,i2);
Шаблоны классов позволяют определить параметризированный тип.
Шаблоны классов аналогично шаблонам функций позволяют на этапе компиляции создавать определения классов.
Шаблон класса указывается ключевым словом template, за которым в угловых скобках указывается список типов для создания параметризированного класса. Имя шаблона класса указывается после ключевого слова class.
Для создания объекта на основе шаблона класса после имени шаблона в угловых скобках указывается конкретный тип:
имя_шаблона_класса <тип> имя_объекта.
Например:
template <class T1> // Описание шаблона класса
class A
{
T1 x,y;
public:
A();
~A();
T1 Fx();
void Fy(T1 a, T1 b);
};
template <class T1> A< T1>::A() {} // Реализация методов шаблона класса
template <class T1> A< T1>::~A() {}
template <class T1>T1 A< T1>::Fx(){ return x*y;}
template <class T1>void A< T1>::Fy(T1 a, T1 b) {x=a; y=b;}
int main(int argc, char* argv[])
{ int i1=1;
int i2=2;
double x=1.5;
double y=2.5;
A <int> F1; // Создание объекта с использованием шаблона класса
A <int> *pF1=F1; // Указатель на объект параметризированного типа
pF1->Fy(i1,i2);
std::cout<<pF1->Fx()<<std::endl;
A <double> F2;
A <double> *pF2=F2;
pF2->Fy(x,y);
std::cout<<pF2->Fx()<<std::endl;
return 0;
}
Свободная память, которую можно заказывать в процессе выполнения программы, называется динамической памятью. Для выделения непрерывного блока памяти можно использовать функцию malloc(), а для освобождения - функцию free(). Прототипы этих функций расположены в заголовочном файле stdlib.h.
Например:
int *pIntBuffer; // Выделение памяти под 5 переменных типа int pIntBuffer=malloc(5*sizeof(int));
При отсутствии требуемого количества памяти функция malloc возвращает значение null.
Выделение динамической памяти также можно выполнять оператором new, а освобождение - оператором delete. Оператор new автоматически учитывает тип объекта и выделяет требуемое количество памяти.
Пример:
double *pBuffer; // Выделение памяти под 10 переменных типа double pBuffer=new double [10];
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.