Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

05.11.2010, 21:40. Просмотров 4174. Ответов 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 минуты
Спасибо заранее
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2010, 21:40
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Почему не вызывается конструктор копирования? (C++):

Почему не вызывается конструктор копирования при возврате объекта из функции - C++
Добрый день! Насколько мне известно, конструктор копирования вызывается: 1) при передачи объекта как аргумента функции ...

Когда вызывается конструктор копирования? - C++
Пожалуйста помогите ответить на вопрос &quot;Когда вызывается конструктор копирования?&quot;

Сколько раз вызывается конструктор копирования - C++
Почему n не увеличивается? Point(const Point&amp; src){ n++; set(src.x+1, src.y+1); cout &lt;&lt; &quot;Konstruction copyrovanija...

В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать? - C++
В книге Г. Шилдта написано, что конструктор копирования может неявно вызываться, при инициализации объекта значением, которое возращает...

Будет ли утрачена память, когда конструктор копирования вызывается для уже существующего объекта класса? - C++
class A { char * v; A(); ~A(); A(const A &amp;obj); } ///////////////////// A::A() {

Почему не вызывается конструктор копии? - C++
Почему не вызывается конструктор копии? class CPoint { friend std::istream &amp;operator&gt;&gt;(std::istream &amp;in, CPoint &amp;obj); friend...

53
Kastaneda
Jesus loves me
Эксперт С++
4749 / 2953 / 242
Регистрация: 12.12.2009
Сообщений: 7,493
Записей в блоге: 2
Завершенные тесты: 1
05.11.2010, 21:52 #2
Если принимается ссылочный аргумент, то конструктор копирования НЕ вызывается!

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

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

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

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

Итак, вопрос остаётся открытым
0
Unforgiven_00
60 / 60 / 3
Регистрация: 12.10.2010
Сообщений: 129
05.11.2010, 22:22 #5
ДА, const лучше убрать, я тоже не буду заострять внимания.
C++
1
2
3
void funktsia(baze other){
  printf ("lllll\n");
 }
Теперь по сабжу. Конструктор копирования никто не изменял. Изменили только функцию.
1
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
05.11.2010, 22:34  [ТС] #6
Ну да.
Надо закреплять всё это. Спасибо.
0
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
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;
}
0
asics
Freelance
Эксперт С++
2854 / 1789 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
11.05.2011, 23:21 #8
Цитата Сообщение от kravam Посмотреть сообщение
//Функция get_object должна вернуть объект, но она НЕ ВОЗВРАЩАЕТ! Почему?
Потому что вы возвращаете локальный обект, добавьте ключевое слово static и конструктор копии вызоветься.
0
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
11.05.2011, 23:27  [ТС] #9
А куда добавить static?
0
asics
Freelance
Эксперт С++
2854 / 1789 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
11.05.2011, 23:29 #10
19 строка.
0
Нач_физик
2 / 2 / 0
Регистрация: 12.02.2011
Сообщений: 49
11.05.2011, 23:33 #11
А откуда знаете, что не возвращает? Как проверить то вернул объект или нет, по коду не видно как?
Конструктор отрабатывает и всё больше ни каких сообщений не предусмотренно.
0
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
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!). А там уж на усмотрение программиста, что он будет с этим значение делать.

А локальные объекты не возвращаются/не копируются. Странно
0
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;
}
0
Нач_физик
2 / 2 / 0
Регистрация: 12.02.2011
Сообщений: 49
12.05.2011, 07:02 #14
Ну, и я говорю конструктор копирования отрабатывает, стороку выводит.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.05.2011, 08:58 #15
Не путайте теорию с практикой. В книге написано одно, а оптимизирующий компилятор делает другое. Если можно безболезненно удрать копирование, оно будет убрано. Если можно вызов функции убрать, она будет убрана.

Цитата Сообщение от kravam Посмотреть сообщение
Я специально привёл этот код, чтобы предупредить возможные возражения.
char* f () { char p []= "stroka"; return p; }
А это вообще некорректный код и делать так нельзя.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2011, 08:58
Привет! Вот еще темы с ответами:

Почему не вызывается конструктор перемещения? - C++
#include &lt;iostream&gt; #include &lt;vector&gt; class Object { public: Object() { std::cout &lt;&lt; &quot;Object()&quot; &lt;&lt; std::endl; ...

Почему вызывается конструктор, а не создание массива? - C++
struct KTest { KTest(int _a, double _b, long long _c) : a(_a), b(_b), c(_c) {} friend ostream&amp; operator &lt;&lt; (ostream&amp; os, KTest const&amp;...

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

Почему конструктор вызывается при присвоении объекта другому объекту - C++
оператор+ выполняется нормально, но когда уже переменная в sum, на след шаге она вызывает конструктор, ибо у меня в примере 9 выходит. А в...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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