Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
#1

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

08.09.2013, 14:08. Просмотров 1951. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2013, 14:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит (C++):

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

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

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

Конструктор, принимающий параметр - C++
привет. посмотрите листинг: // Префиксный и постфиксный операторы инкремента #include <iostream> using namespace std; class...

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

Конструктор принимающий два целочисленных значения - C++
Добрый день существует Конструктор принимающий два целочисленных значения, как можно просмотреть его значение в теле int main() ? A(int...

47
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
10.09.2013, 22:10 #31
http://ideone.com/ZPSK0h
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
10.09.2013, 22:42  [ТС] #32
Спасибо. А вы угадали или знали? Если знали, то разъясните пожалуйста, чем таким отличаются эти варианты:

C++
1
2
foo c1;
foo c2 = c1 ;
C++
1
foo c2 = foo ();
Что в первом случае можно использовать неконстантный КК, а во втором нельзя? Инициализирующий конструктор для простоты напишем такой:
C++
1
foo() {}
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
10.09.2013, 22:45 #33
Цитата Сообщение от 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
BumerangSP
10.09.2013, 23:02
  #34

Не по теме:

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

0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
10.09.2013, 23:05  [ТС] #35
Цитата Сообщение от Croessmah Посмотреть сообщение
foo ( 9 )
стоп. Во-первых, договорились использовать конструктор инициализации
C++
1
foo() {}
. А во вторых (и это главное) почему в первом случае объект неконстантный, а во втором константный? По-моему в этом смысле они оба одинаковы, foo c1 и foo (), никакого "const" нигде не приписано
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
10.09.2013, 23:08 #36
Цитата Сообщение от kravam Посмотреть сообщение
"const" нигде не приписано
временные объекты - это rvalue
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
10.09.2013, 23:10  [ТС] #37
Цитата Сообщение от BumerangSP Посмотреть сообщение
Тут как бы все временные объекты по умолчанию константны.
и опять- почему константны, да ещё и как бы?

Добавлено через 28 секунд
Цитата Сообщение от Croessmah Посмотреть сообщение
временные объекты - это rvalue
ни о чём не говорит.Извините.
0
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
10.09.2013, 23:11 #38
kravam, ну, не "как бы", а точно.) Их незачем изменять.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
10.09.2013, 23:12 #39
Цитата Сообщение от kravam Посмотреть сообщение
ни о чём не говорит.Извините.
ну вот тогда так:
C++
1
2
   int i = 0 ;
   ( i + 1 ) = 10 ;//Ошибка
http://www.rsdn.ru/article/cpp/lvalue.xml
Цитата Сообщение от kravam Посмотреть сообщение
и опять- почему константны, да ещё и как бы?
потому что они временные
0
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,199
Завершенные тесты: 1
11.09.2013, 16:33 #40
Да, 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
DiffEreD
1431 / 768 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.09.2013, 17:38 #41
В С++11 появилось несколько вариантов rvalue, вот тут можно почитать: rvalue ссылки.
Цитата Сообщение от Somebody Посмотреть сообщение
Но какими образом из этого следует, что он сам константный?
Из контекста:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
struct s {};
 
const char* f(const s&&)
{
    return "const";
}
 
const char* f(s&&)
{
    return "non-const";
}
 
const s g() {return s();}
 
int main()
{
   std::cout << f(g()) << std::endl;
   std::cout << f(s()) << std::endl;
 
}
0
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,199
Завершенные тесты: 1
11.09.2013, 18:04 #42
Так вот и я про то же, что константность следует из контекста, а никак не
Цитата Сообщение от Croessmah Посмотреть сообщение
Цитата Сообщение от kravam Посмотреть сообщение
и опять- почему константны, да ещё и как бы?
потому что они временные
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
11.09.2013, 21:26  [ТС] #43
Ну, в общем, я многое понял, но необходимо, конечно закреплять материал. Пока же вопрос у меня такой, вроде один остался- почему временные объекты константны? То есть по логике вещей таки должно быть. А по стандарту? Наверное, ответ должен быть в стандарте где-то, если быть точным в параграфе 12.2 "Temporary objects", но я его там не нашёл.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.09.2013, 22:05 #44
http://herbsutter.com/2008/01/01/got...portant-const/
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
12.09.2013, 20:57  [ТС] #45
Что касается моего вопроса, то по ссылке есть такое предложение

"The "const" is important. The first line is an error and the code won’t compile portably with this reference to non-const, because f() returns a temporary object (i.e., rvalue) and only lvalues can be bound to references to non-const. "

Но где ж тут написано, что временнный объект должен быть константным? Ну да, написано что "const" важна. Но я хоте бы прочесть: "f() возвращает временный объект, который константный". Как-то так.

Добавлено через 22 часа 19 минут
а, ребята?
0
12.09.2013, 20:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2013, 20:57
Привет! Вот еще темы с ответами:

сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять? - C++
сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь...

Функция в качестве аргумента - C++
Мне нужно написать программу, которая будет включать в себя список, который можно добавлять, проверять его заполнение, а также обрабатывать...

Передача шаблона в качестве аргумента - C++
Всем доброго дня. Есть шаблон: template &lt;typename T, ushort cnt&gt; struct Array { private: ushort size; public: T...

Шаблон в качестве аргумента метода(функции) - C++
Доброго дня! Возник вопрос. Существует ли возможность определить параметр метода, указав тип шаблона, но не указывая конкретные типы...


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

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru