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

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

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

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

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

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

Оператор присваивания ничего не знает о типах данных созданных пользователем. Он работает только со стандартными типами, за исключением перегрузки операции присваивания.
dist3=dist1;
Ничего он тут присвоить не может.
KAMLS вне форума Ответить с цитированием
Старый 22.05.2017, 16:27   #12
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

http://en.cppreference.com/w/cpp/lan...opy_assignment

Особое внимание на
Цитата:
If no user-defined copy assignment operators are provided for a class type (struct, class, or union), the compiler will always declare one as an inline public member of the class.
p51x вне форума Ответить с цитированием
Старый 22.05.2017, 16:28   #13
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Ничего он тут присвоить не может.
Ну раз вы все знаете - дерзайте, желаю удачи!
waleri вне форума Ответить с цитированием
Старый 22.05.2017, 17:14   #14
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Вот зашел я помощи попросить. Как многие пишут:
Запомните раз и навсегда: помочь != "решите за меня"!
Если мне по-русски (не по-английски) толково, простыми словами объяснят логику конструкторов (и даже черт с ним, с оператором присваивания), неужели это будет "решение за меня"?
Быть может я через чур наглый, и многого прошу?...
Интересно, сколько символов потребуется, чтобы ясно и внятно объяснить незнающему человеку логику конструктора?
В принципе я не говорю о том, что ничего не знаю вообще. Смысл конструктора понимаю и пользовался им уже в примерах.
Но не понимаю именно некоторые нюансы.
Вот например конструктор с одним аргументом.
Четкий пример.
Конструктор с одним аргументом в примере 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;
	}
KAMLS вне форума Ответить с цитированием
Старый 22.05.2017, 17:19   #15
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так ответили ж уже 2 раза, неужели даже с гугл транслейтом одну строку перевести не можете?)

Там говорится о том, что у классов/структур по умолчанию есть оператор копирования.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 22.05.2017, 17:43   #16
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Т.е. оператор копирования не является конструктором копирования и может пользоваться операцией присваивания:
t12=t24;
dist3=dist1;
?
А как оператор копирования узнал о том, как надо присвоить данные в примере t12=t24;?
Там для такого присваивания целый метод написан (конструктор). С переводом данных одного формата в другой формат.
При этом объекты разных классов.
Я знаю про конструктор копирования по умолчанию, он может сам скопировать присвоить поля одного объекта полям другого но одного класса.
А тут как?
t12=t24;
Как оператор по умолчанию может знать что придет программисту на ум сделать в разных классах? Чтобы потом объекты разных классов присваивать друг другу..
Нет, я понимаю что это делается, но как?!!
KAMLS вне форума Ответить с цитированием
Старый 22.05.2017, 17:49   #17
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

"С переводом данных одного формата в другой формат" это какое-то странное копирование.
Или там из одного класса в другой? Тогда это не то и по умолчанию конечно не будет.

По умолчанию он просто копирует значения всех полей.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 22.05.2017, 17:54   #18
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Дак я тут уже пол-часа расшибаюсь...
Те примеры кодов кто-нибудь смотрел?
Я ведь именно на них озадачился, что не понимаю процесса..
KAMLS вне форума Ответить с цитированием
Старый 22.05.2017, 17:57   #19
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Там программа, переводит формат времени 12 часов в формат времени 24 часа (точнее наоборот)))
Т.е. один класс имеет такие поля, а другой класс другие.
Создан конструктор time12(time24); класса time12.
Вот там то и есть что конструктор работает при создании объекта, а копирование происходит в другой строке:
time12 t12;
t12=t24;
KAMLS вне форума Ответить с цитированием
Старый 22.05.2017, 18:10   #20
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

1. Компилятор увидит
Код:
time12 t12;
t12=t24;
2. Поищет в классе оператор для подобного присваивания - не найдет
3. Создаст временный объект благодаря перегруженному конструктору
Код:
time12(time24);
4. Вызовется оператор присваивания для time12 = time12
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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