Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113

Возвращение временного объекта из метода

30.01.2015, 20:09. Показов 2072. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток,господа!
Сразу к делу:
Имеется следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct Test
{
    int a; //Lets just exist
 
    Test(){} // default constructor
    Test ( Test& t) {} //copy one    | with the copy constructor can't be compiled
    
    Test foo() { return Test(); } //function that returns an obj of Test's class
};
 
int main()
{
    Test t;
 
    return 0;
}
Как я уже отметил в комментариях к коду, вместе с явно определенным копирующим конструктором код не компилируется. Почему так?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.01.2015, 20:09
Ответы с готовыми решениями:

Вызов метода объекта внутри определения метода другого объекта(вложенные классы)
Как мне вызвать метод объекта slider класса Slider внутри определения метода объекта класса StateBar? class StateBar { public: ...

Копирование из временного объекта
1) Собственно, как работает такой конструктор? Хотелось бы какой-нибудь пример. 2) Сильно ли различаются по скорости new/notthrow...

Время жизни временного объекта
можно ли передать временный объект в функцию по ссылке? void f1(int & ); ..... int main() { f1(int());

10
173 / 131 / 74
Регистрация: 04.12.2013
Сообщений: 552
30.01.2015, 20:13
копирующий конструктор выглядит так:
C++
1
Test (const Test& t) {}
И как вы думаете, почему не может?
0
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
30.01.2015, 20:35  [ТС]
Prorok2323, Ок,с const компилируется,но разве const требует стандарт ?
0
173 / 131 / 74
Регистрация: 04.12.2013
Сообщений: 552
30.01.2015, 20:40
TheChosenOne, давайте рассмотрим другой пример:
почему в классе не могут существовать такие функции?
C++
1
2
void add(int i) {}
void add(const int i) {}
0
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
30.01.2015, 20:44  [ТС]
Prorok2323, const для аргументов не участвует в разрешении перегрузки...наверное
0
173 / 131 / 74
Регистрация: 04.12.2013
Сообщений: 552
30.01.2015, 20:46
TheChosenOne, ну вот, а как компилятор в вашем случае будет выбирать между функциями?
0
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
30.01.2015, 20:48  [ТС]
Prorok2323, вы хотите сказать,что компилятор неявно генерирует второй копирующий конструктор для const объектов и тем самым вызывая проблему?
0
173 / 131 / 74
Регистрация: 04.12.2013
Сообщений: 552
30.01.2015, 20:49
Именно
0
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
30.01.2015, 20:58  [ТС]
Prorok2323, я думаю вы ошибаетесь. Имеем следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Test
{
    int a;
public:
Test(){}
Test( Test& t){cout<<"hello\n";}
Test(const Test& t){cout<<"hello const\n" ;}
Test foo() { return Test();}
 
 
 
 
};
 
int main()
{
   const  Test t;
    Test t2(t);
    Test t3(t2);
 
}
Код компилируется, более того, компилятор различает const и non-const объекты.
Output:
hello const
hello
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.01.2015, 21:45
Лучший ответ Сообщение было отмечено TheChosenOne как решение

Решение

Цитата Сообщение от TheChosenOne Посмотреть сообщение
Почему так?
1. Если пользователь явно определил конструкторы,
то компилятор уже не делает дефолтные версии.

Вы определили конструктор:
C++
1
 Test ( Test& t) ;
А это означает, что правильного конструктора:
C++
1
Test (const Test& t) ;
Компилятор уже не сгенерировал.

2. Нельзя передавать временные объекты по неконстантным ссылкам:

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
#include <iostream>
 
struct Test
{
    int a; 
 
    Test(){}
    //Test ( Test& t) {} 
    
    Test foo() { return Test(); } 
};
 
 
void foo( Test& obj)
{
}
 
int main()
{
    Test t;
    
    foo( Test()  ); //<--- error
   //  error: invalid initialization of non-const reference of type ‘Test&’ from an rvalue of type ‘Test’
 
    return 0;
}

Таким образом в вашем случае вы получили только один единственный конструктор,
который принимает не константную ссылку, а значит не в состоянии работать с временным объектом

Ваш конструктор Test ( Test& t) не смог работать с временным объектом по той же причине, что и функция foo

Добавлено через 4 минуты
Цитата Сообщение от Prorok2323 Посмотреть сообщение
Именно
В корне не верно.
Можно определить оба конструктора и все прекрасно будет работать.


А по поводу конкурса перегрузки: в первую очередь предпочтение отдается не константной версии.
Если она не способна принять - тогда выбирается константная версия.
1
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
30.01.2015, 21:52  [ТС]
hoggy, точно! Спасибо большое, теперь можно спать спокойно XD
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.01.2015, 21:52
Помогаю со студенческими работами здесь

Как избежать постоянных инициализаций временного объекта?
Здравствуйте! Будет ли этот код class my::testBuffer{ //код А private: int data; public: testBuffer(const int&amp; d ) :...

Почему для временного безымянного объекта не вызывается оператор ()?
Почему AddValue(value)(*pos); не вызывает operator()(int &amp;elem) из класса AddValue? class AddValue { public: AddValue(int...

Возвращение значения из метода
Есть класс, в нем метод увеличивающий число на единицу, если я его вызываю, то return не возвращает мне единицу, в следствии чего выводится...

Возвращение массива из метода
using System; class MatrixMultiply { static void Main() { int a; a = Input(dst); int b = { { 5, 6...

Возвращение значения из анонимного метода
Как вернут значение из анонимных методов returnRate = d;? Или какой иной подход использовать? using SocketIOClient; using System; ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru