Среда, 08.01.2025, 20:23
Главная Регистрация RSS поиск
Приветствую Вас, Гость
Меню сайта
Категории раздела
HTML [44]
Visual C++ и MFC [21]
c++ [78]
php [19]
Javascript [15]
C# [51]
загрузки [0]
XNA [10]
создание игр с помощью xna
Наш опрос
Каким языком программирования вы увлекаетесь
Всего ответов: 2420
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Реклама
Главная » Статьи » c++

Перегруженные конструкторы

Итак продолжаем подвиги на стезе обучения !!! Первым пунктом нашей программы будут Перегруженные конструкторы. К этому моменту вы уже знаете этих 2 слова по отдельности и иногда можете попугать знакомых ими.

Экскурс в историю

Разные функции могут иметь одно и то же имя, если у этих функций различны количество и/или типы параметров. Это называется перегрузкой функции. А сами функции перегруженными. Обрабатывая вызов перегруженной функции, компилятор смотрит не только на ее имя, но и на список параметров. По количеству и типам передаваемых параметров компилятор может определить, какую же из одноименных функций нужно вызывать в данном случае.

Пример

//Предположим у вас возникла необходимость написать программу для ввода 
//чисел разного типа. Перед вводом числа будет выдаваться подсказка о 
//вводимом типе. Это эффектно реализуется с помощью перегрузки !!!

#include <iostream.h>

//У нас есть перегруженная функция под названием EnterDigit, которая 
//принимает 2 параметра . Существует 2 определения этой функции:
//В первой версии , принимаемые аргументы - это char * и int & .
//В второй версии char * и double & .
//В зависимости от типа переданных значений вызывается соответствующая
//версия .

void EnterDigit (char *str , int &i){
 cout<<str;
 cin>>i;
}
void EnterDigit (char *str , double &i){
 cout<<str;
 cin>>i;
}
void main(){

 int i;
 double d;

 //Вызов версии void EnterDigit (char *str , int &i)
 // так как второй параметр имеет тип int 
 EnterDigit("Enter an integer :",i);

 //Вызов версии void EnterDigit (char *str , int &i)
 // так как второй параметр имеет тип double 
 EnterDigit("Enter a double :",d);

 //Вывод результатов на экран 
 cout<<i<<" "<<d;
}

Послесловие к примеру

Итак мы рассмотрели пример на перегрузку функций . Я надеюсь вы вспомнили,что такое перегруженная функция и с чем её едят.

Маленькое замечание

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

Конец экскурса

О конструкторах вы читали в предыдущем урок.Конструктор - тоже функция отсюда следует вывод !!! Его можно перегрузить . При этом на его перегрузку будут распостраняться все те же правила, которые используются при обычной перегрузке функций .Возникает вопрос , а зачем мне собственно говоря перегружать конструктор ? Для того чтобы при создании обьекта класса вы могли предусмотреть различные способы инициализации .

Пример

//Напишем класс таймер с перегруженным конструктором. 
#include <iostream.h>
#include <stdlib.h>

// В библиотеке stdlib.h находится функция
// atoi (её прототип int atoi( const char *string ) ) ,
// которая конвертирует строку в число. Строка задаётся в качестве
// параметра , возвращаемое значение и будет полученным числом
// Ниже у нас определено 3 версии перегруженного конструктора, которые
// охватывают все возможные случаи инициализации .

class timer {
 int seconds;
public:
 // Первый перегруженный конструктор предназначен для инициализации
 // обьекта с помощью строки
 timer(char *t){
 seconds=atoi(t);
 cout<<" char * "<< "\n";
 }

 // Второй перегруженный конструктор предназначен для инициализации
 // обьекта с помощью целого числа
 timer(int t){
 seconds=t;
 cout<<" int "<< "\n";
 }

 // Третий перегруженный конструктор предназначен для инициализации
 // обьекта с помощью 2 целых чисел ( минут и секунд )
 timer(int min,int sec){
 seconds=min*60+sec;
 cout<<" int , int "<< "\n";
 }
 // Функция для показа количества секунд 
 void ShowTime(){
 cout<<"Seconds : "<<seconds<<"\n";
 }
};

void main(){

 // Обьявления переменных

 //Строковый массив для хранения секунд
 char s[20];

 //Переменная целого типа для хранения секунд
 int sec;

 //Переменная целого типа для хранения минут
 int min;

 // Ввод секунд в строковую переменную 

 cout<< "Put seconds : "<<" \n ";
 cin>> s ;

 // Ввод секунд в переменную целого типа 

 cout<< "Put seconds one more time : "<<" \n ";
 cin>> sec ;

 // Ввод минут в переменную целого типа 

 cout<< "Put minutes : "<<" \n ";
 cin>> min ;

 // Создание 3-х обьектов класса таймер 

 timer a(s), b(sec), c( min, sec);

 // Показ значений секунд 

 a.ShowTime();
 b.ShowTime();
 c.ShowTime();
}

Вывод

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

Категория: c++ | Добавил: slava (30.05.2011)
Просмотров: 3457 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]