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

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

08.09.2013, 14:08. Показов 5075. Ответов 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
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
08.09.2013, 14:31
Так должно скомпилиться:
C++
1
foo(const foo& f)
По идее, если компилятор не сделает оптимизацию, то сначала вызовется конструктор для временного объекта, потом уже конструктор копирования. На деле это происходит только с опцией: -fno-elide-constructors (для gcc). А ошибка компиляции есть в любом случае, как то странно.
0
 Аватар для BumerangSP
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
08.09.2013, 16:04
Тут как бы все временные объекты по умолчанию константны. А вместо конструктора, принимающего константную ссылку определен конструктор только не с константной. Можно также это увидеть на примере:
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    const foo c;
    foo c2 = c; // ошибка, нет конструктора, принимающего константную ссылку.
}
//или
int main()
{
    foo c(9);
    foo c2 = c; // все нормально
}
Или вопрос не в этом?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
08.09.2013, 21:22  [ТС]

Смотрите, есть код:
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
                foo(foo& f)
                    { 
                    }
появляется ошибка в строке
C++
1
foo c2 = foo (9);
Несмотря на то, что конструктор к этой строке имеет отношение как СВИНЬЯ К АПЕЛЬСИНАМ. Тем не менее, происходит ошибка, почему- не знаю. Почему?
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
08.09.2013, 21:43
Для создания объекта c2 в первом случае используется конструктор копирования по умолчанию. Во втором же случае используется пользовательский конструктор копирования который принимает неконстантную ссылку, что и приводит к ошибке, ибо на вход ему передается rvalue
0
 Аватар для BumerangSP
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
08.09.2013, 21:44
kravam, ну так я и говорю: потому что при foo c2 = foo (9); вызывается определенный пользователем копирующий конструктор, принимающий неконстантную ссылку, хотя сам временной объект - константный. Не было б определено копирующего конструктора - он был бы сгенерирован компилятором, но только принимающий константную ссылку.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
08.09.2013, 22:26  [ТС]
Цитата Сообщение от Voivoid Посмотреть сообщение
Во втором же случае используется пользовательский конструктор копирования который принимает неконстантную ссылку, что и приводит к ошибке, ибо на вход ему передается rvalue
Но я не написал конструктора копирования, как же может использоваться конструктор копирования, которого нет?

Добавлено через 1 минуту
Цитата Сообщение от BumerangSP Посмотреть сообщение
kravam, ну так я и говорю: потому что при foo c2 = foo (9); вызывается определенный пользователем копирующий конструктор, принимающий неконстантную ссылку,
то же самое- нет пользовательского конструктора копирования, не написал я его!
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
08.09.2013, 22:41
Цитата Сообщение от kravam Посмотреть сообщение
Но я не написал конструктора копирования, как же может использоваться конструктор копирования, которого нет?
Цитата Сообщение от kravam Посмотреть сообщение
foo(foo& f)
это и есть конструктор копирования согласно стандарту с++
A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&,
volatile X& or const volatile X&
, and either there are no other parameters or else all other parameters
have default arguments (8.3.6). [ Example: X::X(const X&) and X::X(X&,int=1) are copy constructors.
0
 Аватар для BumerangSP
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
08.09.2013, 23:04
kravam,
Цитата Сообщение от BumerangSP Посмотреть сообщение
Не было б определено копирующего конструктора - он был бы сгенерирован компилятором, но только принимающий константную ссылку.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
09.09.2013, 20:23  [ТС]
Цитата Сообщение от Voivoid Посмотреть сообщение
Во втором же случае используется пользовательский конструктор копирования который принимает неконстантную ссылку, что и приводит к ошибке
Вопрос ко всем: я правильно понял, что компилятор хочет использовать КК, находит мой КК
C++
1
foo(foo& f) { }
Но коль скоро он неправилен, то компилятор на него и ругается?

Хотя, между прочим ОН правилен! Он соответствует стандарту- первому образцу из цитаты- ну простоты ради условимся пока, что мой компилятор старенький, gcc 4.6.2, новым стандартам не обучен
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
09.09.2013, 20:26
Цитата Сообщение от kravam Посмотреть сообщение
Вопрос ко всем: я правильно понял, что компилятор хочет использовать КК, находит мой КК
C++
1
foo(foo& f) { }
Но коль скоро он неправилен, то компилятор на него и ругается?
твой КК правильный с точки зрения с++, но он неправильный с точки зрения твоего использования
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
09.09.2013, 20:27  [ТС]
Стоп. Если синтаксис моего КК верен, то... то всё. Компилятор должен компильнуть. Но он не компилит, вот в чём дело.

А уж если я его неправильно использую, увидим исключение какое-нибудь во время выполнения программы.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
09.09.2013, 20:29
Цитата Сообщение от kravam Посмотреть сообщение
Стоп. Если синтаксис моего КК верен, то... то всё. Компилятор должен компильнуть. Но он не компилит, вот в чём дело.
синтаксис КК верен, но
Цитата Сообщение от kravam Посмотреть сообщение
C++
1
foo c2 = foo (9);
используешь ты его неверно
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
09.09.2013, 20:48  [ТС]
Цитата Сообщение от Jupiter Посмотреть сообщение
используешь ты его неверно
а как его использовать верно?
0
 Аватар для BumerangSP
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
09.09.2013, 20:50
kravam, с неконстантными объектами.
Вот аналогичная ситуация:
C++
1
2
3
4
5
6
7
8
9
10
class A
{
public:
    A(int &val) {} // добавить const и все ок 
};
 
int main()
{
    A(10);
}
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
09.09.2013, 20:53  [ТС]
А какой бы конструктор копирования подошёл для такого кода?
C++
1
foo c2 = foo (9);
Минимальный компилящийся код, пожалуйста. Без наворотов.
0
 Аватар для BumerangSP
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
09.09.2013, 20:56
C++
1
2
3
4
5
6
7
8
9
10
11
class foo
{
public:
    foo(int x) {}
    foo(const foo& f) {}
};
 
int main()
{
    foo c2 = foo (9);
}
или даже так:
C++
1
2
3
4
5
6
7
8
9
10
class foo
{
public:
    foo(int x) {}
};
 
int main()
{
    foo c2 = foo (9);
}
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
09.09.2013, 20:57
Вот мое понимание всего этого:
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
class foo
{
public:
   foo() {}
   foo(int x) {}
   foo(foo& f) {}
   ~foo(){}
};
 
int main()
{
   //int& reference = 9;        //Error
   const int& creference = 9; //Ok
 
   //foo& foo_ref = foo(9);       //Error
   const foo& foo_cref = foo(9);//Ok
 
   //foo f = foo(9); //Error: foo(9) есть rvalue; конструктору копий передается
                     //rvalue, а он принимает неконстантную ссылку что не допускается
 
   foo f(9);
   foo& no_const_ref = f; //Ok
   foo f2 = f; //Ok, конструктору копий передается lvalue
   foo f3 = no_const_ref; //Ok
   foo f4 = foo_cref;     //Error
 
   return 0;
}
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
09.09.2013, 21:03  [ТС]
Что и требовалось доказать. Надеюсь я ничьих чувств не задену, если вставлю сюда отладочную надпись, которую НИКТО НИКОГДА НЕ УВИДИТ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
class foo
{
public:
    foo(int x) {}
    foo(const foo& f) {printf ("вот её никто никогда не увидит\n");}
};
 
int main()
{
    foo c2 = foo (9);
    getchar ();
}
Так почему же когда я пишу КК, который почему-то использовать нельзя (хотя он синтаксический правильный)- компилятор ругается. Но когда ему подсовываешь тот КК, который можно использовать (почему-то) компилятор его не использует? Фигня какая-то
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
09.09.2013, 21:39
В данном случае компилятор в целях оптимизации избавляется от лишнего вызова конструктора копирования
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.09.2013, 21:39
Помогаю со студенческими работами здесь

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

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

Раздельное объявление и описание шаблонной функции, принимающей в качестве операндов ссылку на объект класса "вектор"
Приветствую. Есть код: #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; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
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
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru