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

Константные функции-члены класса, возвращающие ссылку на константу - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 56, средняя оценка - 4.66
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
08.08.2011, 21:09     Константные функции-члены класса, возвращающие ссылку на константу #1
Упражняюсь по книге Липпмана, выполняю задания по теме классы.
Необходимо реализовать класс person, который способен хранить имя и адрес человека, а также создать функции, возвращающие при обращении имя и адрес.
Вопрос, который ставит автор книги: "Должны ли эти функции быть константными? Объясните почему."
Вот тут я начал путаться. Вот моя реализация:
файл person.h
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
#ifndef PERSON_H_
#define PERSON_H_
 
class person {
public:
    //конструктор, принимающий две строки типа string
    person( std::string &_name, std::string &_addres ) :
        name( _name ), addres( _addres ) {
    }
    //метод, возвращающий addres
    const std::string &get_addres() const {
        return addres;
    }
    //метод, возвращающий name
    const std::string &get_name() const {
        return name;
    }
 
private:
    //поле для хранения имени
    std::string name;
    //поле для хранения адреса
    std::string addres;
};
 
#endif /* PERSON_H_ */
Для тестирования класса, файл test_class_person.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include "person.h"
using namespace std;
 
int main() {
    string str1 = "Alexander";
    string str2 = "Zelenogradsk";
    person pers( str1, str2 );
    cout << pers.get_name() << " " << pers.get_addres() << endl;
    
    string str3 = pers.get_name();
    str3 += "222";
    cout << str3 << " " << pers.get_name();
    return 0;
}
Я решил так
1) Константными эти функции должны быть, так как они не меняют значений переменных-членов объекта.
2) Возвращать они должны лишь константную ссылку на строку, а не просто тип string, дабы избежать ненужного копирования.
Прав ли я? Если нет, то объясните почему.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2011, 21:09     Константные функции-члены класса, возвращающие ссылку на константу
Посмотрите здесь:

C++ Константные статические объекты класса.
класс «Строка» (данные-члены класса – строчка, функции-члены класса – операции) C++
C++ Константные функции-члены ?
константные поля класса C++
Почему нехорошо себя ведёт конструктор класса (не компилится ничё), если ему параметром ссылку на константу? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
10.08.2011, 18:07     Константные функции-члены класса, возвращающие ссылку на константу #41
Цитата Сообщение от lavan Посмотреть сообщение
Возврат const string & необходим чтобы избежать возможности изменять private часть класса без использования интерфейса
Это неверно, от const_cast никак в таком случае не застраховаться.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LosAngeles
Заблокирован
10.08.2011, 19:44     Константные функции-члены класса, возвращающие ссылку на константу #42
const_cast малость не подходит под категорию "случайное изменение инкапсулированных данных", всё по делу
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
10.08.2011, 19:48     Константные функции-члены класса, возвращающие ссылку на константу #43
Цитата Сообщение от LosAngeles Посмотреть сообщение
const_cast малость не подходит под категорию "случайное изменение инкапсулированных данных"
Только вот некоторые бездари используют приведение типа в стиле Си, которому на всё ***.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
10.08.2011, 21:14     Константные функции-члены класса, возвращающие ссылку на константу #44
Цитата Сообщение от LosAngeles Посмотреть сообщение
const_cast малость не подходит под категорию "случайное изменение инкапсулированных данных"
Где здесь фраза "случайное изменение инкапсулированных данных":
Цитата Сообщение от lavan Посмотреть сообщение
Возврат const string & необходим чтобы избежать возможности изменять private часть класса без использования интерфейса
?
Сыроежка
Заблокирован
10.08.2011, 21:30     Константные функции-члены класса, возвращающие ссылку на константу #45
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Где здесь фраза "случайное изменение инкапсулированных данных":

?
Потому что если вы умышленно меняете то, что не предназначалось для изменения, как вы предложили с помощью const_cast, то вы - вредитель. Автор того сообщения имел в виду, когда можно неумышленно изменить то, что не подлежит изменению в виду неудачного интерфейса. То есть интерфейс должен способствовать правильному использованию данных и препятствовать их неправильному использованию. Это и было сказано в исходном сообщении. На мой взгляд, это совершенно ясно, так что не надо переспрашивать, "где зедсь фраза".
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.08.2011, 11:02     Константные функции-члены класса, возвращающие ссылку на константу #46
Цитата Сообщение от Сыроежка Посмотреть сообщение
На мой взгляд, это совершенно ясно
Это на ваш взгляд. А, например, на мой взгляд "избежать возможности изменять" и "неумышленно изменить" - разные вещи. Так что, как видите, вы не являетесь последней инстанцией и не уполномочены додумывать за людьми недосказанное. Пока автор не уточнил свои слова, не стоит так категорично пояснять то, как вы их поняли.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
11.08.2011, 12:09     Константные функции-члены класса, возвращающие ссылку на константу #47
Пока так и не увидел ни одного реального довода в пользу НЕиспользования константных ссылок в качестве возвращаемого значения. Пример вроде
C++
1
const string& sss = ( person( str1, str2 ).get_name() );
выглядит как-то не очень убедительно. А по поводу const_cast полностью согласен с вышесказанным:
Цитата Сообщение от Сыроежка Посмотреть сообщение
если вы умышленно меняете то, что не предназначалось для изменения, как вы предложили с помощью const_cast, то вы - вредитель.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
11.08.2011, 12:26     Константные функции-члены класса, возвращающие ссылку на константу #48
Цитата Сообщение от rangerx Посмотреть сообщение
Пока так и не увидел ни одного реального довода в пользу НЕиспользования константных ссылок в качестве возвращаемого значения.
Утверждение вроде "Пользователи класса НЕ должны иметь прямого доступа к его скрытым членам" - не аргумент?

Цитата Сообщение от Deviaphan Посмотреть сообщение
Только вот некоторые бездари используют приведение типа в стиле Си
Если это на мой садовый участок кирпич, так и средствами С++ вполне можно ссылку на константный объект сделать ссылкой на неконстантный... Вообще думаю, первое, что сделает начинающий и не слишком хорошо учившийся программист при сообщении компилятора "... bla bla bla const bla bla bla..." - постарается от константности избавиться. И таки добьётся своего. Что будет дальше - загадка...
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.08.2011, 13:14     Константные функции-члены класса, возвращающие ссылку на константу #49
Цитата Сообщение от rangerx Посмотреть сообщение
Пока так и не увидел ни одного реального довода в пользу НЕиспользования константных ссылок в качестве возвращаемого значения.
Основная пробелама ссылок, это то что они могут пережить объект на который ссылаются. Чем не повод (наряду с соблюдением инкапсуляции) не возвращать их?
Цитата Сообщение от Сыроежка Посмотреть сообщение
Потому что если вы умышленно меняете то, что не предназначалось для изменения, как вы предложили с помощью const_cast, то вы - вредитель.
Я никого константность снимать и не призываю, я лишь указал на то, что возврат константной ссылки на внутренности объекта никак не позволит
Цитата Сообщение от lavan Посмотреть сообщение
избежать возможности изменять private часть класса без использования интерфейса
Кроме того, если вы, как разработчик класса, даете лазейку в виде применения const_cast клиентам, то это исключительно Ваша проблема, что Вы не сумели продумать дизайн, действительно исключающий возможность изменения внутреннего состояния объекта Вашего класса за его пределами.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
11.08.2011, 13:35     Константные функции-члены класса, возвращающие ссылку на константу #50
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Основная пробелама ссылок, это то что они могут пережить объект на который ссылаются. Чем не повод (наряду с соблюдением инкапсуляции) не возвращать их?
Ага, и от указателей по той же причине отказаться. Да и вообще от C++
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.08.2011, 13:37     Константные функции-члены класса, возвращающие ссылку на константу #51
grizlik78, а кто предлагал отказаться? Предлагается не возвращать ссылки на закрытые члены класса, и всего-то))
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
11.08.2011, 13:48     Константные функции-члены класса, возвращающие ссылку на константу #52
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну меня, по-крайней мере, не убедили.
Если пользователь случайно или намеренно меняет значения по ссылкам/указателям на константу, то он ССЗБ. Надо такому пользователью в одном из вызовов вернуть ссылку на настоящую константу, пусть попрыгает
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.08.2011, 14:06     Константные функции-члены класса, возвращающие ссылку на константу #53
Цитата Сообщение от grizlik78 Посмотреть сообщение
Надо такому пользователью в одном из вызовов вернуть ссылку на настоящую константу
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.08.2011, 16:33     Константные функции-члены класса, возвращающие ссылку на константу #54
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ага, и от указателей по той же причине отказаться.
Если Вы про встроенные указатели (T*), то, естественно, отказатся.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
11.08.2011, 23:08     Константные функции-члены класса, возвращающие ссылку на константу #55
должны лишь константную ссылку на строку, а не просто тип string, дабы избежать ненужного копирования.
Т.е если использовать const ... & ... , будет работать быстрее?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.08.2011, 23:11     Константные функции-члены класса, возвращающие ссылку на константу #56
Avazart, разумеется. Возвращая string, вы возвращаете объект, т.е. копируете все его данные (в том числе надо выделить память под новую строку и скопировать в неё содержимое старой). Возвращая string &, вы, по сути, возвращаете адрес.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
11.08.2011, 23:57     Константные функции-члены класса, возвращающие ссылку на константу #57
Ну да, а const применяется что бы случайно не изменить содержание этого адреса
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.08.2011, 00:03     Константные функции-члены класса, возвращающие ссылку на константу #58
Avazart, ага, а const_cast отметает это дело, поэтому я всё-таки за возвращение копии.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,688
12.08.2011, 07:14     Константные функции-члены класса, возвращающие ссылку на константу #59
Ну, с одной стороны стандарт разрешает компилятору из цепочки копирований объекта удалять очевидные. Если это относится и к случаю копирования в переменную объекта, возвращаемого из функции по значению, то это делает данный спор несколько бессмысленным. А с другой стороны итераторы STL, например, специально спроектированы так, что после изменения контейнера становятся недействительными, но из-за этого никто не призывает от них отказаться.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2011, 11:36     Константные функции-члены класса, возвращающие ссылку на константу
Еще ссылки по теме:

Константные методы и объекты класса C++
Константные функции-члены C++
Где инициализировать константные данные класса? C++

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

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
12.08.2011, 11:36     Константные функции-члены класса, возвращающие ссылку на константу #60
Цитата Сообщение от Mr.X Посмотреть сообщение
А с другой стороны итераторы STL, например, специально спроектированы так, что после изменения контейнера становятся недействительными, но из-за этого никто не призывает от них отказаться
Итератор становится недействительными только если элемент на который он указывал был удален или перемещен, поэтому инвалидация итератора и изменение контейнера слабо связанные события. Да и итератор, как возвращаемое значение метода, довольно редкое явление, в отличии от указателей и ссылок.
Yandex
Объявления
12.08.2011, 11:36     Константные функции-члены класса, возвращающие ссылку на константу
Ответ Создать тему
Опции темы

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