Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.83
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
#1

Почему не вызывается конструктор копирования? - C++

05.11.2010, 21:40. Просмотров 3854. Ответов 53
Метки нет (Все метки)

...У меня в книге описаны случаи при которых вызывается конструктор копирования. Один из этих случаев:

: "Когда аргумент имеет тип класса. Создаётся копия аргумента и затем передаётся в функцию"

Ну-с попробуем смоделировать такую ситуацию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
using namespace std;
 
class baze {
public:
 
 //Конструктр объекта класса baze, заданный по умолчанию
 baze () {printf ("wwwww\n");};
 
 //Эта функция, которая принимает ссыочный аргумент. Следовательно, при её вызове ДОЛЖЕН 
 //вызваться конструктр копирования
 void funktsia(const baze &other){
  printf ("lllll\n");
 }
 
 //А вот и сам конструктр копирования. Он иногда должен вызываться. Где- см. ниже 
 baze (const baze &src) {
  printf ("rrrrr\n");
 }
 
};
 
int main() {
 
 baze f;
 
 //В это месте должен вызываться конструктор копирования, ибо функция funktsia() принимает
 //ссылочный аргумент. Тычем на исполнение и ждём появления строчки "rrrrr"
 f.funktsia(f);
 
 //Но наблюдаем всего лишь "wwwww" (создался объект класса baze) и "lllll" (вызвана функция
 //funktsia () Как она приняла аргумент- для меня до сих пор загадка.)
 //Конструктор копирования не вызван. ПОчему?
 getchar ();
 return 0;
}
Добавлено через 2 минуты
Спасибо заранее
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2010, 21:40     Почему не вызывается конструктор копирования?
Посмотрите здесь:
C++ Почему не вызывается конструктор копирования при возврате объекта из функции
Когда вызывается конструктор копирования? C++
Сколько раз вызывается конструктор копирования C++
C++ В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать?
Будет ли утрачена память, когда конструктор копирования вызывается для уже существующего объекта класса? C++
Почему не вызывается конструктор копии? C++
C++ Почему не вызывается конструктор перемещения?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
05.11.2010, 21:52     Почему не вызывается конструктор копирования? #2
Если принимается ссылочный аргумент, то конструктор копирования НЕ вызывается!

Добавлено через 1 минуту
вот так вызовется
C++
1
2
3
void funktsia( baze other){
  printf ("lllll\n");
 }
Unforgiven_00
60 / 60 / 2
Регистрация: 12.10.2010
Сообщений: 129
05.11.2010, 21:53     Почему не вызывается конструктор копирования? #3
Если в функцию передавать не ссылку, а обьект, тогда и будет использоваться конструктор копирования, а как раз з ссылкой этого не будет происходить.
C++
1
2
3
 void funktsia(const baze other){
  printf ("lllll\n");
 }
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
05.11.2010, 22:17  [ТС]     Почему не вызывается конструктор копирования? #4
Стоп-стоп. Ребята, в этой же книге определён синтаксис конструктора копирования, а вы оба от него отошли. Синтаксис такой: (дословно)

"Синтаксис для объявления конструктора копирования следующий:
имя_класса (имя_класса const & источник)"

То есть надо именно так.

Unforgiven_00,
я Вам больше скажу, в книжке написано, что ваш вариант исползовать нельзя и даже описано почему нельзя. ПОка не буду на этом заострять внимания (если чё после аргументирую)

Итак, вопрос остаётся открытым
Unforgiven_00
60 / 60 / 2
Регистрация: 12.10.2010
Сообщений: 129
05.11.2010, 22:22     Почему не вызывается конструктор копирования? #5
ДА, const лучше убрать, я тоже не буду заострять внимания.
C++
1
2
3
void funktsia(baze other){
  printf ("lllll\n");
 }
Теперь по сабжу. Конструктор копирования никто не изменял. Изменили только функцию.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
05.11.2010, 22:34  [ТС]     Почему не вызывается конструктор копирования? #6
Ну да.
Надо закреплять всё это. Спасибо.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
11.05.2011, 23:00  [ТС]     Почему не вызывается конструктор копирования? #7
ОК, с одним разобрались, а теперь вот другая ситуация; тоже должен вызываться конструктор копирования и тоже он не вызывается. Почему? Хотя в книге написано, что конструктор копирования вызывается, когда возвращаемое значение имеет тип класса!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
using namespace std;
 
class arr
{
  public:
    arr(int number){};
    arr(const arr &obj);
};
 
 
arr::arr(const arr &obj)
{
  cout << "Вызов копирующего конструктора" << "\n";
}
 
 
arr get_object (int number) {
 arr obj (number);
 return obj; 
}
 
 
 
 
int main()
{
  //Функция get_object должна вернуть объект, но она НЕ ВОЗВРАЩАЕТ! Почему?
  get_object(15);
  getchar ();
  return 0;
}
asics
Freelance
Эксперт С++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
11.05.2011, 23:21     Почему не вызывается конструктор копирования? #8
Цитата Сообщение от kravam Посмотреть сообщение
//Функция get_object должна вернуть объект, но она НЕ ВОЗВРАЩАЕТ! Почему?
Потому что вы возвращаете локальный обект, добавьте ключевое слово static и конструктор копии вызоветься.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
11.05.2011, 23:27  [ТС]     Почему не вызывается конструктор копирования? #9
А куда добавить static?
asics
Freelance
Эксперт С++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
11.05.2011, 23:29     Почему не вызывается конструктор копирования? #10
19 строка.
Нач_физик
2 / 2 / 0
Регистрация: 12.02.2011
Сообщений: 49
11.05.2011, 23:33     Почему не вызывается конструктор копирования? #11
А откуда знаете, что не возвращает? Как проверить то вернул объект или нет, по коду не видно как?
Конструктор отрабатывает и всё больше ни каких сообщений не предусмотренно.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
11.05.2011, 23:44  [ТС]     Почему не вызывается конструктор копирования? #12
Цитата Сообщение от Нач_физик Посмотреть сообщение
А откуда знаете, что не возвращает? Как проверить то вернул объект или нет, по коду не видно как?
Конструктор отрабатывает и всё больше ни каких сообщений не предусмотренно.
Как это не предусмотрено? Очень даже предусмотрено

C++
1
cout << "Вызов копирующего конструктора" << "\n";
//+++++++++++++++++++++++++++++++++++++++++++++++++
static это static, а вот как без static? Да и мне непонятно, почему без static не вызывается конструктор
копирования? Ну и что, что объект локальный, функции и должны возвращать значения ЛОКАЛЬНЫХ
переменных (Не глобальных же). Кстати, это происходит сплошь и рядом
C++
1
2
3
4
5
6
7
char* f () {
 char p []= "stroka";
 return p;
} 
 
int main () {
}
Я специально привёл этот код, чтобы предупредить возможные возражения.
Да, могут выдаться разные предупреждения, особенно если p инициализировано локальной же строкой. Но факт остаётся фактом- значение p- адреса локальной переменной возвернётся (предврительно скопировавшись... Ну если уж кому интересно в регистр EAX. В общем, ВО ВНЕ. И заметтье, безо всяких static!). А там уж на усмотрение программиста, что он будет с этим значение делать.

А локальные объекты не возвращаются/не копируются. Странно
SashaPinsk
39 / 37 / 2
Регистрация: 27.12.2009
Сообщений: 73
12.05.2011, 00:28     Почему не вызывается конструктор копирования? #13
Конструктор копирования в твоём коде вызывается. Почему ты решил, что он не вызывается?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <locale>
 
using namespace std;
 
class arr
{
  public:
    arr(int number){};
    arr(const arr &obj);
};
 
 
arr::arr(const arr &obj)
{
  cout << "Вызов копирующего конструктора" << "\n";
}
 
 
arr get_object (int number) {
 arr obj (number);
 return obj; 
}
 
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    //Функция get_object должна вернуть объект, но она НЕ ВОЗВРАЩАЕТ! Почему?
    get_object(15);
    getchar ();
    return 0;
}
Нач_физик
2 / 2 / 0
Регистрация: 12.02.2011
Сообщений: 49
12.05.2011, 07:02     Почему не вызывается конструктор копирования? #14
Ну, и я говорю конструктор копирования отрабатывает, стороку выводит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2011, 08:58     Почему не вызывается конструктор копирования?
Еще ссылки по теме:
Почему вызывается конструктор, а не создание массива? C++
Почему конструктор вызывается повторно при преобразовании типов? C++
Почему не вызывается ни конструктор копий, ни функция перегруженного оператора присвоения C++
Почему конструктор вызывается при присвоении объекта другому объекту C++
C++ Не работает конструктор копирования почему-то...

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.05.2011, 08:58     Почему не вызывается конструктор копирования? #15
Не путайте теорию с практикой. В книге написано одно, а оптимизирующий компилятор делает другое. Если можно безболезненно удрать копирование, оно будет убрано. Если можно вызов функции убрать, она будет убрана.

Цитата Сообщение от kravam Посмотреть сообщение
Я специально привёл этот код, чтобы предупредить возможные возражения.
char* f () { char p []= "stroka"; return p; }
А это вообще некорректный код и делать так нельзя.
Yandex
Объявления
12.05.2011, 08:58     Почему не вызывается конструктор копирования?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru