Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/22: Рейтинг темы: голосов - 22, средняя оценка - 4.68
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705

Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит

08.09.2013, 14:08. Показов 5508. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Друзья! Вот корректный код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class foo
{
public:
                foo()
                    { 
                    }
                foo(int x)
                    { 
                    }
                ~foo(){}
};
 
 
//+++++++++++++++++++++++++++++++++++++
 
int main()
{
    foo c2 = foo (9);
}
А вот некорректный:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class foo
{
public:
                foo()
                    { 
                    }
                foo(int x)
                    { 
                    }
                foo(foo& f)
                    { 
                    }
                ~foo(){}
};
 
 
//+++++++++++++++++++++++++++++++++++++
 
int main()
{
    foo c2 = foo (9);
}
Ошибки,

Bash
1
2
3
4
5
6
7
8
9
10
main_p.cpp: In function 'int main()':
main_p.cpp:21:20: error: no matching function for call to 'foo::foo(foo)'
main_p.cpp:21:20: note: candidates are:
main_p.cpp:10:17: note: foo::foo(foo&)
main_p.cpp:10:17: note:   no known conversion for argument 1 from 'foo' to 'foo&'
main_p.cpp:7:17: note: foo::foo(int)
main_p.cpp:7:17: note:   no known conversion for argument 1 from 'foo' to 'int'
main_p.cpp:4:17: note: foo::foo()
main_p.cpp:4:17: note:   candidate expects 0 arguments, 1 provided
Выполнение завершено
первая же из которых вводит в ступор. У меня нет вызова foo::foo(foo)! Если бы он был, то первый код не скомпилился бы. В общем, непонятно, почему foo(foo& f) всё портит во втором коде, хотелось бы разъяснений, тык скыть. Спасибо, кто откликнется.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.09.2013, 14:08
Ответы с готовыми решениями:

Класс не содержит конструктор, принимающий 3 аргумента: найти ошибку в коде
Весь измучился, но компилятор неприклонен - "Ошибка 1 SAYAP_labaratornaya2.Student не содержит конструктор, который принимает 3...

Создать функцию, которая принимает в качестве аргумента ссылку на string, и преобразует все буквы в верхний регистр
Задание такое: нужно создать функцию, которая принимает в качестве аргумента ссылку на string, и преобразует все буквы в верхний регистр,...

Компилятор требует конструктор, принимающий аргументом экземпляр того же класса (не ссылку)
Доброго времени суток. Проблема такова: имеется ряд нижеприведённых классов (для простоты всё, что навскидку не касается данной...

47
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
09.09.2013, 21:46
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kravam Посмотреть сообщение
Фигня какая-то
copy elision
Цитата Сообщение от kravam Посмотреть сообщение
которую НИКТО НИКОГДА НЕ УВИДИТ?
-fno-elide-constructors для gcc
0
292 / 172 / 47
Регистрация: 22.03.2010
Сообщений: 488
09.09.2013, 21:47
Цитата Сообщение от kravam Посмотреть сообщение
которую НИКТО НИКОГДА НЕ УВИДИТ
А ведь с опцией -fno-elide-constructors увидят. Ведь без учета оптимизаций здесь и должна быть ошибка компиляции: вы не передаете конструктору копирования lvalue
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
09.09.2013, 21:50
Просто конструкторы копирования у kravam "любимая мозоль"
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
09.09.2013, 21:53
RVO и NRVO
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
09.09.2013, 22:02  [ТС]
Цитата Сообщение от Voivoid Посмотреть сообщение
В данном случае компилятор в целях оптимизации избавляется от лишнего вызова конструктора копирования
Очень может быть. В таком случае зачем он требует КК (назовём его "правильный"), если при предоставлении ему правильного КК он от него избавляется в целях оптимизации? Типа- дай-ка, kvaram, я посмотрю, а умеешь ли ты писать правильные КК?

Добавлено через 3 минуты
Цитата Сообщение от grizlik78 Посмотреть сообщение
Просто конструкторы копирования у kravam "любимая мозоль"
ого! Но так-то ситуации немного разнятся. В той теме я разобрался, почему КК не вызывается- просто объект уже создаётся по месту, что называется. Так он и в этой теме тоже воздаётся по месту. Но компилятор зачем-то требует ПРАВИЛЬНЫЙ КК, а потом него не использует (коль скоро оптимизирует код- создаёт объект там, где он будет в конце концов). Предметы у тем всё-таки разные.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
09.09.2013, 22:04
Цитата Сообщение от kravam Посмотреть сообщение
В таком случае зачем он требует КК (назовём его "правильный"), если при предоставлении ему правильного КК он от него избавится в целях оптимизации?
потому что сначала идет компиляция а потом оптимизация( уже бинарного кода)
у тебя ошибка на этапе компиляции, до оптимизатора дело не доходит
оптимизировать нечего, код не создан
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
09.09.2013, 22:04
Цитата Сообщение от kravam Посмотреть сообщение
Очень может быть. В таком случае зачем он требует КК (назовём его "правильный"), если при предоставлении ему правильного КК он от него избавится в целях оптимизации?
Потому, что это разные этапы. На этапе синтаксического разбора компилятор "не задумывается" об оптимизации. А на этапе оптимизации уже поздно делать послабления. Да и не нужно.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
09.09.2013, 22:06  [ТС]
Цитата Сообщение от Hrobak Посмотреть сообщение
А ведь с опцией -fno-elide-constructors увидят. Ведь без учета оптимизаций здесь и должна быть ошибка компиляции: вы не передаете конструктору копирования lvalue
Специально для хороших парней не поленюсь повторить- меня не интересует, как ОБЯЗАТЕЛЬНО вызвать КК. Меня интересует, почему компилятор требует правильный КК, а потом его в целях оптимизации или чего там убирает на фиг.
0
292 / 172 / 47
Регистрация: 22.03.2010
Сообщений: 488
09.09.2013, 22:26
Оптимизация может происходить на разных стадиях компиляции, но, как правило, как выше написал grizlik78, оптимизации происходят после синтаксического и семантического анализа кода.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
10.09.2013, 21:56  [ТС]
Многие вопросы я уже выяснил. Но один, очень важный не выяснил, а именно: каков код, в котором использовался бы конструктор который не const?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
class foo
{
public:
    foo(int x) {}
    foo(const foo& f) {printf ("KK\n");
}
};
 
int main()
{
    foo c2 = foo (9);
    getchar ();
}
компилим с опцией
Bash
1
-fno-elide-constructors
, дабы компилятор не вздумал не создавать временные объекты. Так, а теперь хотелось бы увидеть аналогичный работоспособный код с конструктором, который
C++
1
foo(foo& f)
(он же верен!) То есть чтобы также, была одна из ситуаций, при которой вызывается КК, (а их напомню, 3, описанных в книге:

1) Когда возвращаемое значение функции имеет тип класса
2) Когда аргумент имеет тип класса
3) Когда один объект используется для инициализаци другого объекта)


Ну и чтобы вызвался
C++
1
foo(foo& f)
. Всё. Вся просьба.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
10.09.2013, 22:10
http://ideone.com/ZPSK0h
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
10.09.2013, 22:42  [ТС]
Спасибо. А вы угадали или знали? Если знали, то разъясните пожалуйста, чем таким отличаются эти варианты:

C++
1
2
foo c1;
foo c2 = c1 ;
C++
1
foo c2 = foo ();
Что в первом случае можно использовать неконстантный КК, а во втором нельзя? Инициализирующий конструктор для простоты напишем такой:
C++
1
foo() {}
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
10.09.2013, 22:45
Цитата Сообщение от kravam Посмотреть сообщение
Если знали, то разъясните пожалуйста, чем таким отличаются эти варианты:
тем что в первом c1 - это не константный объект, значит можно вызвать foo ( foo & ) или foo ( const foo & ).
а во втором foo ( 9 ) - это объект константный и не просто константный, а временный, так что можно вызывать только foo ( const foo & ).
Можно даже без конструкторов и классов привести пример подобного поведения:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void foo ( const int & ) {
 
}
 
void bar ( int & ) {
 
}
 
int main ( ) {
   foo ( 5 ) ; //OK
   bar ( 5 ) ; //ошибка компиляции
}
0
10.09.2013, 23:02

Не по теме:

Видимо, я объяснять не умею :) Тоже самое описывал еще в постах три и пятнадцать.

0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
10.09.2013, 23:05  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
foo ( 9 )
стоп. Во-первых, договорились использовать конструктор инициализации
C++
1
foo() {}
. А во вторых (и это главное) почему в первом случае объект неконстантный, а во втором константный? По-моему в этом смысле они оба одинаковы, foo c1 и foo (), никакого "const" нигде не приписано
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
10.09.2013, 23:08
Цитата Сообщение от kravam Посмотреть сообщение
"const" нигде не приписано
временные объекты - это rvalue
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
10.09.2013, 23:10  [ТС]
Цитата Сообщение от BumerangSP Посмотреть сообщение
Тут как бы все временные объекты по умолчанию константны.
и опять- почему константны, да ещё и как бы?

Добавлено через 28 секунд
Цитата Сообщение от Croessmah Посмотреть сообщение
временные объекты - это rvalue
ни о чём не говорит.Извините.
0
 Аватар для BumerangSP
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
10.09.2013, 23:11
kravam, ну, не "как бы", а точно.) Их незачем изменять.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
10.09.2013, 23:12
Цитата Сообщение от kravam Посмотреть сообщение
ни о чём не говорит.Извините.
ну вот тогда так:
C++
1
2
   int i = 0 ;
   ( i + 1 ) = 10 ;//Ошибка
http://www.rsdn.ru/article/cpp/lvalue.xml
Цитата Сообщение от kravam Посмотреть сообщение
и опять- почему константны, да ещё и как бы?
потому что они временные
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
11.09.2013, 16:33
Да, rvalue биндится на константную ссылку и не биндится на неконстантную. Но какими образом из этого следует, что он сам константный?

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
const char* f(const int&&)
{
    return "const";
}
 
const char* f(int&&)
{
    return "non-const";
}
 
int main()
{
    std::cout << f(9);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.09.2013, 16:33

Как передать в качестве аргумента функции ссылку на массив
Приветствую. Из названия я думаю вопрос понятен, но я поясню. Есть функция которая на выходе выдаёт массив, но мне не нужно чтобы она...

Научить метод принимать в качестве аргумента объект своего класса и дочерних классов
Как научить метод принимать в качестве аргумента объект своего класса и дочерних классов? Как их передавать при вызове метода?

Раздельное объявление и описание шаблонной функции, принимающей в качестве операндов ссылку на объект класса "вектор"
Приветствую. Есть код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;clocale&gt; #include &lt;vector&gt; #include &lt;iterator&gt; ...

Создать функцию, имеющую два аргумента и возвращающую в качестве аргумента число из отрезка [a,b]
Создать функцию, которая будет иметь два целочисленных параметра a и b, и в качестве своего значения возвращать случайное целое число из...

Конструктор, принимающий параметр
привет. посмотрите листинг: // Префиксный и постфиксный операторы инкремента #include &lt;iostream&gt; using namespace std; ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru