Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять? C++
C++ Конструктор принимающий два целочисленных значения
Функция в качестве аргумента C++
C++ Передача функции в качестве аргумента массив
Передача двухмерного массива в качестве аргумента C++
C++ Создать функцию, которая принимает в качестве аргумента ссылку на string, и преобразует все буквы в верхний регистр
Передача символьного массива в качестве аргумента C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1425 / 762 / 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;
 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2775 / 1589 / 142
Регистрация: 03.12.2007
Сообщений: 4,162
Завершенные тесты: 1
11.09.2013, 18:04     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит #42
Так вот и я про то же, что константность следует из контекста, а никак не
Цитата Сообщение от Croessmah Посмотреть сообщение
Цитата Сообщение от kravam Посмотреть сообщение
и опять- почему константны, да ещё и как бы?
потому что они временные
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
11.09.2013, 21:26  [ТС]     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит #43
Ну, в общем, я многое понял, но необходимо, конечно закреплять материал. Пока же вопрос у меня такой, вроде один остался- почему временные объекты константны? То есть по логике вещей таки должно быть. А по стандарту? Наверное, ответ должен быть в стандарте где-то, если быть точным в параграфе 12.2 "Temporary objects", но я его там не нашёл.
Jupiter
Каратель
Эксперт C++
6548 / 3968 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.09.2013, 22:05     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит #44
http://herbsutter.com/2008/01/01/got...portant-const/
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
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 минут
а, ребята?
Jupiter
Каратель
Эксперт C++
6548 / 3968 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.09.2013, 21:18     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит #46
временный объект не является константным, но забиндить его можно только к ссылке на константу
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
12.09.2013, 21:39  [ТС]     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит #47
Как понять "забиндить"?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2013, 22:34     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит
Еще ссылки по теме:

C++ Конструктор, принимающий параметр
C++ Компилятор требует конструктор, принимающий аргументом экземпляр того же класса (не ссылку)
C++ Как передать функцию в качестве аргумента?
C++ Передача матрицы в метод в качестве аргумента
Научить метод принимать в качестве аргумента объект своего класса и дочерних классов C++

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6548 / 3968 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.09.2013, 22:34     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит #48
Цитата Сообщение от kravam Посмотреть сообщение
Как понять "забиндить"?
привязать
Yandex
Объявления
12.09.2013, 22:34     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит
Ответ Создать тему
Опции темы

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