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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2010, 17:34   #1
Юра_YUYU
 
Регистрация: 16.01.2010
Сообщений: 8
По умолчанию Передача объекта в функцию

Здравствуйте, Господа!
Есть вопрос. Использую Microsoft Visual C++ 2005. Пишу код:

Код:
using namespace std;

class A {
	int a;
public:
	A(int i) { 
		cout << "Konstr\n";
		a = i;
	};
	/*A(const A &obj) {
		cout << "Konstr kopii\n";
		a = obj.a;
	};*/
	~A(void) {
		cout << "Destr\n";
	};
	void show(void) { cout << a << '\n'; };
};

void f(A obj) {
	obj.show();
}

int _tmain(int argc, _TCHAR* argv[])
{
	int i = 45;
	{
		f(A(i));
	}
	cin >> i;
	return 0;
}
На экране вижу:

Konstr
45
Destr
Destr

Добавляю копирующий конструктор в класс путём удаления коменнтария:

Код:
using namespace std;

class A {
	int a;
public:
	A(int i) { 
		cout << "Konstr\n";
		a = i;
	};
	A(const A &obj) {
		cout << "Konstr kopii\n";
		a = obj.a;
	};
	~A(void) {
		cout << "Destr\n";
	};
	void show(void) { cout << a << '\n'; };
};

void f(A obj) {
	obj.show();
}

int _tmain(int argc, _TCHAR* argv[])
{
	int i = 45;
	{
		f(A(i));
	}
	cin >> i;
	return 0;
}

На экране вижу:

Konstr
45
Destr

Вопрос. Почему без копирующего конструктора временный объект создаётся, а при его включении в класс, временный объект не создаётся?

Последний раз редактировалось MaTBeu; 16.01.2010 в 18:09.
Юра_YUYU вне форума Ответить с цитированием
Старый 16.01.2010, 17:53   #2
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

А нельзя-ли просто передать ссылку на объект?
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 16.01.2010, 18:03   #3
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

В функцию объекты должны передаваться либо через ссылку, либо через константную ссылку. Передача копии бессмысленна и тратит много времени.
Carbon вне форума Ответить с цитированием
Старый 16.01.2010, 18:10   #4
Юра_YUYU
 
Регистрация: 16.01.2010
Сообщений: 8
По умолчанию

Да, я всё это понимаю, но ваш ответ не отменяет моего вопроса.
Юра_YUYU вне форума Ответить с цитированием
Старый 16.01.2010, 18:18   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
В функцию объекты должны передаваться либо через ссылку, либо через константную ссылку.
либо через указатель, либо через константный указатель, либо через указатель на константу, либо через константный указатель на константу
Цитата:
Сообщение от Carbon Посмотреть сообщение
Передача копии бессмысленна и тратит много времени.
А это уже зависит от выполняемой задачи. Такое жесткое табу ставить не стоит. Если я хочу реализовать длинное целое и чтобы в коде этот MyLongInt вёл себя как int, long,... то, почему бы его не копировать, передавая в функции по значению? Опять же можно реализовать разрушающее копирование (см. auto_ptr). Да и в целом в передаче объектов по значению(т.е. их неявному копированию) ничего плохого нет (если конечно это дело используется с умом).
pu4koff вне форума Ответить с цитированием
Старый 17.01.2010, 15:16   #6
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

Возможно это какое-то хитрое правило, но больше похоже на хитрую оптимизацию, которую компилятор в состоянии сделать при определенных условиях. При каких - я не знаю.
Есть например 'оптимизация возвращаемого значения', она же RVO с той лишь разницей, что там исключаются лишние копирования на выходе из функций. Вот там что-то очень похожее. Загляните в статейку по RVO, может наведет на какие-нибудь мысли: http://alenacpp.blogspot.com/2008/02/rvo-nrvo.html

Последний раз редактировалось _Ч_; 17.01.2010 в 15:18.
_Ч_ вне форума Ответить с цитированием
Старый 17.01.2010, 20:16   #7
Юра_YUYU
 
Регистрация: 16.01.2010
Сообщений: 8
По умолчанию

Спасибо большое. Уже что-то проясняется. Но ваша ссылочка к сожалению не открылась почему-то. Оптимизация связанная со стеком программы, наверное. В одном случае обьект копируется в стек, для передачи в функцию, т.е создаётся временный объект, в другом случае объект создаётся в самой функции.
Юра_YUYU вне форума Ответить с цитированием
Старый 17.01.2010, 20:28   #8
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

хм. вроде открывается.
ну попробуйте в яндексе RVO набрать. первая же ссылка как раз ссылка на эту статью.
_Ч_ вне форума Ответить с цитированием
Старый 17.01.2010, 22:10   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от _Ч_ Посмотреть сообщение
Возможно это какое-то хитрое правило, но больше похоже на хитрую оптимизацию, которую компилятор в состоянии сделать при определенных условиях. При каких - я не знаю.
Это больше похоже на особенность/баг оптимизатора. gcc в обоих вариантах копию не создаёт, как и должно быть по идее.
pu4koff вне форума Ответить с цитированием
Старый 17.01.2010, 23:05   #10
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

А как по мне - тут самое удивительное, что конструктор вызывался меньше раз, чем деструктор о_О
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Си++. Передача массива в функцию. Diamond2107 Помощь студентам 7 03.12.2009 20:15
Передача поля объекта в процедуру в качестве параметра Голованов Д. Microsoft Office Excel 10 02.11.2009 16:22
Передача массива в функцию D[I]K Общие вопросы C/C++ 4 13.09.2009 21:31
передача массива в функцию JOFRIF Общие вопросы C/C++ 8 02.08.2009 12:46
Передача массива в функцию Vistar Общие вопросы C/C++ 1 27.04.2009 08:08