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

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

30.01.2015, 20:09. Показов 2050. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru