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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2015, 17:25   #1
MrQuestion
Пользователь
 
Регистрация: 16.08.2015
Сообщений: 40
По умолчанию Проблемы с копирующим конструктором

Код:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int maxname = 20;

class turbo
{
      protected:
                char name[maxname];
      public:
             turbo(char* pname = "name")
             {
                      strcpy(name,pname);
                      cout << name << endl;
             } 
             
             turbo(turbo& m)
             {
                      strcpy(name,"Copy of ");
                      strcat(name, m.name);
                      cout << name << endl;
                      
             }
             ~turbo() {}
};
void fn(turbo some)
{
     cout << "Копия прошла" << endl;
}

int main()
{
    setlocale(LC_ALL,"Rus");
    turbo turboOne("Turbo");
    turbo turboTwo(turboOne);
    fn(turboOne);
    
    

    system("PAUSE");
    return 0;
}
Здравствуйте.

Вопрос мой находится где то в этой строке
Код:
void fn(turbo some)
Не понятно, как все это работает. Попытаюсь восстановить алгоритм и описать, что происходит в main. Прошу уличить меня в моих ошибках!
1) Объявляется некий элемент turboOne, в аргумент конструктора которого передаётся строка "Turbo".
2) Создается элемент turboTwo, которому передается целый объект. У компилятора в этот момент есть выбор только между двумя конструкторами и он передает аргумент turboTwo копирующему конструктору.
3) Дальше идет функция fn, которая аргументом своим берет некий элемент класса turbo. Не ссылку на него, не указатель, а весь элемент целиком.

Основной вопрос касается функции fn. Как компилятор понимает, что в fn, переданный ей объект нужно конструировать копирующим конструктором?
MrQuestion вне форума Ответить с цитированием
Старый 04.09.2015, 17:30   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Не бывает "элемента целиком", бывает копия.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 04.09.2015, 17:42   #3
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Код:
    turbo turboTwo(turboOne); <= вот вызов копирующего конструктора
    fn(turboOne);
GreenWizard вне форума Ответить с цитированием
Старый 04.09.2015, 20:54   #4
MrQuestion
Пользователь
 
Регистрация: 16.08.2015
Сообщений: 40
По умолчанию

Цитата:
Сообщение от GreenWizard Посмотреть сообщение
Код:
    turbo turboTwo(turboOne); <= вот вызов копирующего конструктора
    fn(turboOne);
Это то ясно. Неясно другое. fn... fn очень сильно интересует. Она тоже вызывает у объекта копирующий конструктор. Как она это делает? У нее в аргументе ни адреса, ни ссылки, ни намека на то, что надо вызвать копирующий конструктор. А она все равно гнет свою линию.
MrQuestion вне форума Ответить с цитированием
Старый 04.09.2015, 20:56   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Как это нет намека? Это ж просто синтаксис для передачи копии в функции. Можно копию, можно ссылку, можно указатель, больше никак* нельзя.

* ну может есть и другие варианты, я не гуру С++, но это основные
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 04.09.2015 в 20:58.
Alex11223 вне форума Ответить с цитированием
Старый 04.09.2015, 21:07   #6
MrQuestion
Пользователь
 
Регистрация: 16.08.2015
Сообщений: 40
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Как это нет намека? Это ж просто синтаксис для передачи копии в функции. Можно копию, можно ссылку, можно указатель, больше никак* нельзя.

* ну может есть и другие варианты, я не гуру С++, но это основные
Истина где то рядом, но я все равно не понял. Можно то же самое, но только для тех, кто в бронепоезде?
MrQuestion вне форума Ответить с цитированием
Старый 04.09.2015, 21:11   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Что именно вы понять пытаетесь? Так в С++ выглядит синтаксис передачи копии объекта.
Код:
void fn(turbo some)
было б * или & — была б не копия.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 04.09.2015, 21:17   #8
MrQuestion
Пользователь
 
Регистрация: 16.08.2015
Сообщений: 40
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Что именно вы понять пытаетесь? Так в С++ выглядит синтаксис передачи копии объекта.
Код:
void fn(turbo some)
Я пытаюсь понять, как в функции fn происходит вызов копирующего конструктора. По идее должна быть некая вещь такого рода fn(turbo some(turbo& some2))
MrQuestion вне форума Ответить с цитированием
Старый 04.09.2015, 21:23   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Кому должна? Вы ж не на ассемблере пишете.
Если так написано — значит передается копия, будет вызван конструктор копирования для создания копии. Больше нет вариантов при такой записи, потому и не надо ничего самому вызывать.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 04.09.2015, 21:27   #10
MrQuestion
Пользователь
 
Регистрация: 16.08.2015
Сообщений: 40
По умолчанию

Т.е.мне остается лишь смириться со своей нелегкой долькой , вздохнуть тяжело и запомнить этот злой непонятный и нелогичный синтаксис?
MrQuestion вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка с конструктором копирования Qwoort Общие вопросы C/C++ 11 13.06.2012 21:53
Проблемы с конструктором Merovingian Общие вопросы C/C++ 8 28.09.2011 14:55
Проблема с конструктором igor17 Общие вопросы C/C++ 13 15.05.2011 22:23
Что-то не так с конструктором Дырдин Общие вопросы C/C++ 7 26.03.2010 18:33
Помогите с конструктором girkoff Общие вопросы C/C++ 10 01.11.2009 16:01