Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2017, 10:21   #1
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию Конструктор.

Здравствуйте!
Никак не могу полностью понять суть конструктора. Не всё понимаю по его возможностям.
Смотрел Википедию. Учусь по Лафоре.
Правильно ли я понял, что конструктор, это функция (метод), срабатывающая при создании объекта?
Если это так, то почему конструктор копирования по умолчанию работает после создания объекта?
Строка 30 следующего кода:

Код:
#include<iostream>
#include<conio.h>
using namespace std;
class Distance
{
private:
	int feet;
	float inches;
public:
	Distance(): feet(0), inches(0)
	{}
	Distance(int ft, float in):feet(ft),inches(in)
	{}
	void getdist()
	{
		cout<<"\nВведите число футов: "; cin>>feet;
		cout<<"\nВведите число дюймов: "; cin>>inches;
	}
	void showdist() const
	{
		cout<<feet<<"\'-"<<inches<<'\"';
	}
};
int main()
{
	setlocale(LC_ALL,"rus");
	Distance dist1(11, 6.25);
	Distance dist2(dist1);
	Distance dist3;
	dist3=dist1;
	cout<<"\ndist1= "; dist1.showdist();
	cout<<"\ndist2= "; dist2.showdist();
	cout<<"\ndist3= "; dist3.showdist();
	cout<<endl;
	getch();
	return 0;
}
Также конструктор с одним аргументом в примере Times 2 работает после создания объекта в следующей строке. Строка 92 следующего кода:

Код:
#include<iostream>
#include<string>
#include<conio.h>
using namespace std;
class time24
{
private:
	int hours;
	int minutes;
	int seconds;
public:
	time24(): hours(0), minutes(0), seconds(0)
	{}
	time24(int h, int m, int s): hours(h), minutes(m), seconds(s)
	{}
	void display() const
	{
		if(hours<10)
			cout<<'0';
		cout<<hours<<':';
		if(minutes<10)
			cout<<'0';
		cout<<minutes<<':';
		if(seconds<10)
			cout<<'0';
		cout<<seconds;
	}
int getHrs()const
	{return hours;}
int getMins()const
	{return minutes;}
int getSecs()const
	{return seconds;}
};
class time12
{
private:
	bool pm;
	int hrs;
	int mins;
public:
	time12(): pm(true), hrs(0), mins(0)
	{}
	time12(time24);
	time12(bool ap, int h, int m): pm(ap), hrs(h), mins(m)
	{}
void display()const
{
	cout<<hrs<<':';
	if(mins<10)
		cout<<'0';
	cout<<mins<<' ';
	string am_pm=pm ? "p.m." : "a.m.";
	cout<<am_pm;
}
};
time12::time12(time24 t24)
{
	int hrs24=t24.getHrs();
	pm=t24.getHrs()<12 ? false : true;
	mins=t24.getSecs()<30 ? t24.getMins() : t24.getMins()+1;
	if(mins==60)
	{
		mins=0;
		++hrs24;
		if(hrs24==12 || hrs24==24)
			pm=(pm==true) ? false : true;
	}
	hrs=(hrs24<13) ? hrs24 : hrs24-12;
	if(hrs==0)
	{
		hrs=12;
		pm=false;
	}
}
int main()
{
	setlocale(LC_ALL,"rus");
	int h,m,s;
	while(true)
	{
		cout<<"Введите время в 24-часовом формате: \n";
		cout<<"Часы (от 0 до 23): "; cin>>h;
		if (h>23)
			return(1);
		cout<<"Минуты: "; cin>>m;
		cout<<"Секунды: "; cin>>s;
		time24 t24(h,m,s);
		cout<<"\nИсходное время: ";
		t24.display();
		time12 t12;
		t12=t24;
		cout<<"\nВ 12-часовом формате: ";
		t12.display();
		cout<<"\n\n";
	}
		getch();
		return 0;
	}
Примерно такая же ситуация возникает в работе программы Times 1. Там функция преобразования значения времени работающая по ключевому слову operator, работает на следующей строке после работы ключевого слова.
Код:
#include<iostream>
#include<string>
#include<conio.h>
using namespace std;
class time12
{
private:
	bool pm;
	int hrs;
	int mins;
public:
	time12(): pm(true), hrs(0), mins(0)
	{}
	time12(bool ap, int h, int m): pm(ap), hrs(h), mins(m)
	{}
	void display()const
	{
		cout<<hrs<<':'; // Если строку сделать так cout<<hrs<<' : '; получается бред. Почему?
		if(mins<10)
			cout<<'0';
		cout<<mins<<' ';
		string am_pm=pm ? "p.m." : "a.m.";
		cout<<am_pm;
	}
};
class time24
{
private:
	int hours;
	int minutes;
	int seconds;
public:
	time24 (): hours(0), minutes(0), seconds(0)
	{}
	time24 (int h, int m, int s): hours(h), minutes(m), seconds(s)
	{}
	void display () const
	{
		if(hours<10) 
			cout<<'0';
		cout<<hours<<':';
		if(minutes<10) 
			cout<<'0';
		cout<<minutes<<':';
		if(seconds<10) 
			cout<<'0';
		cout<<seconds;
	}
	operator time12() const;
};
time24::operator time12() const
{
	int hrs24=hours;
	bool pm=hours<12 ? false : true;
	int roundMins=seconds<30 ? minutes : minutes+1;
	if(roundMins==60)
	{
		roundMins=0;
		++hrs24;
		if(hrs24==12 || hrs24==24)
			pm=(pm==true) ? false : true;
	}
	int hrs12=(hrs24<13) ? hrs24 : hrs24-12;
	if(hrs12==0)
	{
		hrs12=12;
		pm=false;
	}
	return time12(pm, hrs12, roundMins);
}
int main()
{
	setlocale(LC_ALL,"rus");
	int h, m, s;
	while(true)
	{
		cout<<"Введите время в 24-часовом формате: \n";
		cout<<"Часы (от 0 до 23): "; cin>>h;
		if(h>23)
			return 1;
		cout<<"Минуты: "; cin>>m;
		cout<<"Секунды: "; cin>>s;
		time24 t24 (h,m,s);
		cout<<"\nИсходное время: ";
		t24.display();
		time12 t12;//Если убрать следующую строку, то время после введённого будет равно 0. 
		           //В таком случае, когда срабатывает функция time24::operator time12() const?
		           //Если не убирать, то всё работает как надо. В каком моменте работает функция?
		           //В учебнике строка выглядела так:  time12 t12=t24;
		t12=t24;
		cout<<"\nВ 12-часовом формате: ";
		t12.display();
		cout<<"\n\n";
	}
	getch();
	return 0;
}
Объясните пожалуйста суть конструктора.
KAMLS вне форума Ответить с цитированием
Старый 22.05.2017, 10:28   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Правильно ли я понял, что конструктор, это функция (метод), срабатывающая при создании объекта?
Упрощенно так

Цитата:
Если это так, то почему конструктор копирования по умолчанию работает после создания объекта?
Код:
Distance dist3;
dist3=dist1;
Потому что создается новый объект. Вам понятно почему тут два раза конструктор вызовется:
Код:
Distance* dist3 = new Distance;
dist3 = new Distance;
?
p51x на форуме Ответить с цитированием
Старый 22.05.2017, 10:50   #3
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Нет не понятно.
KAMLS вне форума Ответить с цитированием
Старый 22.05.2017, 10:51   #4
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Конструктор должен работать только в момент создания объекта. Если нет, если есть вариации, то нужен принцип, по которой работают эти вариации.
Distance dist3;
Всё, объект создан, конструктор должен отработать в этот момент. Не отработал, всё работает что-то другое, например нужен какой-то метод.
dist3=dist1; Это уже другая строка. Другой момент. Это не создание объекта, это работа с объектами.
Так работает моя логика на основе тех знаний которые есть.

Последний раз редактировалось KAMLS; 22.05.2017 в 10:54.
KAMLS вне форума Ответить с цитированием
Старый 22.05.2017, 11:05   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так он и вызывается в момент создания. Просто в том сообщении два объекта создано, new Distance два раза вызван же.

А при dist3=dist1 вы ж копию создаете, новый объект.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 22.05.2017, 11:17   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Конструктор должен работать только в момент создания объекта.
Воистину

Цитата:
Distance dist3;
Всё, объект создан, конструктор должен отработать в этот момент.
Так глаголите

Цитата:
dist3=dist1; Это уже другая строка. Другой момент.
Именно

Цитата:
Это не создание объекта, это работа с объектами.
Нет... Это создание нового объекта путем копирования из...
p51x на форуме Ответить с цитированием
Старый 22.05.2017, 15:37   #7
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Воистину


Так глаголите


Именно


Нет... Это создание нового объекта путем копирования из...
Я понимаю, что дело кроется в подходе восприятия логики языка С++. У меня такого подхода еще нет. Я просто не вижу целостной картины механики этой логики языка. Именно её я и ищу.
Объясните пожалуйста, какой именно объект создаётся в строке:
dist3=dist1;
dist3 создан выше, в строке:
Distance dist3;
В строке dist3=dist1; значения полей объекта dist1 копируются в поля объекта dist3.
Объект dist3 заново не создаётся.
KAMLS вне форума Ответить с цитированием
Старый 22.05.2017, 15:56   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Если это так, то почему конструктор копирования по умолчанию работает после создания объекта?
Давайте зайдем с другой стороны - почему вы решили, что в указанных примерах работает конструктор копирования?
waleri вне форума Ответить с цитированием
Старый 22.05.2017, 16:01   #9
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

А что ж там работает?
KAMLS вне форума Ответить с цитированием
Старый 22.05.2017, 16:04   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
А что ж там работает?
Оператор присваивания - это разные вещи!
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конструктор KHz Помощь студентам 4 14.12.2015 12:49
Конструктор gospodenkods Фриланс 3 22.04.2014 07:27
конструктор zla9_kolu4ka Общие вопросы C/C++ 2 09.03.2014 02:37
С++ (конструктор, деструктор, копирующий конструктор) Jane-sad Помощь студентам 2 01.10.2010 10:01
Конструктор PilGrim Общие вопросы C/C++ 0 16.01.2009 10:21