test a = func();
должен испоьзовать конструктор копии, так как func() возвращает объект
Пользователь решил продолжить мысль 26 Мая 2013, 14:30:41:
кажется я нашел объяснение

вот один код:
/* Создание конструктора копии */
using namespace std;
#include <iostream>
class test {
int x_;
public:
test(int x) {x_=x; cout << "Был вызван конструктор объекта (" << x_ << ")." << endl;};
test(const test &obj) {x_=obj.x_; cout << "Был вызван конструктор копии объекта (" << x_ << ")." << endl;};
~test() {cout << "Был вызван деструктор объекта (" << x_ << ")." << endl;};
int getCh() {return x_;};
};
test func() {
test a(9); // Вызов обычного конструктора
return a;
}
int main() {
test c(2);
cout << "#CH1# " << endl;
c=func();
cout << "#CH2# " << endl;
cout << "Объекты синхронизированы!" << endl;
cout << "Завершение программы..." << endl;
return 0;
}
для удобства я убрал new и delete, чтобы не выдавало сегфолт без перегрузки оператора =
здесь используется "оптимизация" g++ (текст вида #текст# добавлен как пояснение):
Был вызван конструктор объекта (2). #test c(2)#
#CH1# #cout << "#CH1# " << endl;#
Был вызван конструктор объекта (9). #test a(9);#
Был вызван деструктор объекта (9). #a вышла из области видимости, при этом сначала неявно скопирована в c (побитно)#
#CH2#
Объекты синхронизированы!
Завершение программы...
Был вызван деструктор объекта (9). #c выходит из области видимости main()#
другой код:
/* Создание конструктора копии */
using namespace std;
#include <iostream>
class test {
int x_;
public:
test(int x) {x_=x; cout << "Был вызван конструктор объекта (" << x_ << ")." << endl;};
test(const test &obj) {x_=obj.x_; cout << "Был вызван конструктор копии объекта (" << x_ << ")." << endl;};
~test() {cout << "Был вызван деструктор объекта (" << x_ << ")." << endl;};
int getCh() {return x_;};
};
test func() {
test a(9); // Вызов обычного конструктора
return a;
}
int main() {
test c(2);
cout << "#CH1# " << endl;
c=func();
cout << "#CH2# " << endl;
cout << "Объекты синхронизированы!" << endl;
cout << "Завершение программы..." << endl;
return 0;
}
модифицируем функцию func():
test func() {
test a(9), *p=&a; // Вызов обычного конструктора
return *p;
}
вывод при такой модификации:
Был вызван конструктор объекта (2).
#CH1#
Был вызван конструктор объекта (9).
Был вызван конструктор копии объекта (9).
Был вызван деструктор объекта (9).
Был вызван деструктор объекта (9).
#CH2#
Объекты синхронизированы!
Завершение программы...
Был вызван деструктор объекта (9).
две добавленные строки означают, что на место func() подставляется временный объект, который создается конструктором копии от временного объекта, получившегося в результате вычисления *p. то есть здесь нет никакой оптимизации, идем "напролом"
итого, оптимизация появляется когда мы вызываем "return объект;" и исчезает, когда мы вызываем "return выражение;".
в одном из моих предыдущих сообщений применяется инициализация, она дает другой результат - rerurn a; "перемещает" результат в инициализируемую переменную (без деструктора).
cамое интересное - если в первом варианте использовать динамически-выделяемую память - произойдет сегфолт.
PS так это оптимизация или фича c++?