Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
58 / 48 / 14
Регистрация: 23.02.2016
Сообщений: 433
1

Константная функция с константной ссылкой

05.03.2019, 08:23. Показов 2562. Ответов 6

Author24 — интернет-сервис помощи студентам
Есть следующая строка
C++
1
const std::vector<Point> extract(const std::vector<Point> &points)
Правильно ли я понимаю, что аргумент данной функции не является константой (вернее по этой строке мы не можем утверждать, что аргумент является константой), а просто происходит оптимизированная передача аргумента в функцию (то есть сам аргумент может изменяться)?

И второй вопрос: что означает const std::vector<Point> перед именем функции, что функция вернёт константный вектор? Но если функция вернёт константный вектор, то получается, что при неоднократном вызове функции неоднократно инициализируется константный вектор, который возвращается функцией, а константы инициализируются только один раз, как быть?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2019, 08:23
Ответы с готовыми решениями:

Как сделать доступным обращение к методу параметра, объявленного константной ссылкой?
Ругается на строку, содержащую присваивание локальной переменной значения метода параметра,...

Перегруженная константная функция
В Qt в классе QByteArray есть две функции: char *data(); const char *data() const; Как...

Константная ссылка
Один из уважаемых мне людей сказал, что в &quot;Дизайн и эволюция С++&quot; писали, что круто писать void...

Возможна ли константная наследуемость?
Здравствуйте! Определил класс, который позволяет хранить некие данные (предоставляет интерфейс),...

6
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
05.03.2019, 08:31 2
Лучший ответ Сообщение было отмечено Timurs как решение

Решение

Цитата Сообщение от Timurs Посмотреть сообщение
Правильно ли я понимаю, что аргумент данной функции не является константой (вернее по этой строке мы не можем утверждать, что аргумент является константой), а просто происходит оптимизированная передача аргумента в функцию (то есть сам аргумент может изменяться)?
Да, если я правильно понял ваш вопрос, вы можете передать через константную ссылку изначально неконстантный объект. Это будет означать, что через эту ссылку объект нельзя будет поменять.

Цитата Сообщение от Timurs Посмотреть сообщение
при неоднократном вызове функции неоднократно инициализируется константный вектор, который возвращается функцией, а константы инициализируются только один раз
Эти отверждения не противоречат. Объект каждый раз разный и он инициализируется один раз. Собственно, любой объект инициализируется один раз, от константности тут ничего не зависит.

Цитата Сообщение от Timurs Посмотреть сообщение
как быть?
Разобраться, наверное. Ведь тут нет никакой проблемы...
1
58 / 48 / 14
Регистрация: 23.02.2016
Сообщений: 433
05.03.2019, 09:32  [ТС] 3
DrOffset, спасибо, разобрался! В курсе, что при вызовах функции возвращаемые значения разные, но с этими константами что-то запутался. Собственно этот пример увидел здесь https://www.youtube.com/watch?v=LuaNbkRPGRo на 13:40 рефакторят эту строку и убирают const перед функцией. Не очень понятно почему его убрали, да и вообще непонятно зачем этот const тут нужен ведь функция в любом случае вернёт каждый раз разный вектор, тем не менее, судя по примеру, компилятор на const перед именем функции не ругается, а значит в таком случае наверняка какой-то смысл есть (иначе бы его выпилили). Может быть const перед именем функции и означает, что аргументы функции нельзя поменять, а тогда получается масло масляное и его убрали, верно?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
05.03.2019, 10:32 4
Лучший ответ Сообщение было отмечено Timurs как решение

Решение

Цитата Сообщение от Timurs Посмотреть сообщение
Может быть const перед именем функции
Будет означать, что временный объект, который возвращает функция, нельзя будет изменить.
Т.е.
C++
1
2
3
std::vector<Point> vec(1);
 
extract(vec)[0] = Point(1, 2); // error
В большинстве случаев это не нужно, т.к. обычно результат функции сразу копируют куда-то.
2
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
05.03.2019, 10:46 5
Цитата Сообщение от DrOffset Посмотреть сообщение
обычно результат функции сразу копируют куда-то.
это я долго понимал (почему то), тут еще важно понимать работу конструкторов и операторов присваивания в том числе и определенных пользователем. думаю правильный ответ
0
58 / 48 / 14
Регистрация: 23.02.2016
Сообщений: 433
05.03.2019, 11:31  [ТС] 6
DrOffset, спасибо! Мощный пример, однако, написали
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
05.03.2019, 15:14 7
Timurs,
Цитата Сообщение от DrOffset Посмотреть сообщение
extract(vec)[0] = Point(1, 2);
в данном случае нужно понимать что обычно есть две версии:

C++
1
2
T const& vector::operator[](T const&) const;
T& vector::operator[];
0
05.03.2019, 15:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2019, 15:14
Помогаю со студенческими работами здесь

Константная переменная и константный указатель
В чем разница : int const а; const int a; С указателями такое видел, с переменными нет.

Константная ссылка в качестве аргумента конструктору копирования
доброго времени суток! реализую класс String для работы со строками, программа не компилируется,...

Передача по константной ссылке
void print(const std::string strs, const char c); void print(const std::vector&lt;std::string&gt;&amp;...

Алгоритм с константной асимптотикой
Нужно за О(1) давать ответ сколько элементов элементов последовательности установлено в 1...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru