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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 56, средняя оценка - 4.66
Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
#1

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

08.08.2011, 21:09. Просмотров 7269. Ответов 64
Метки нет (Все метки)

Упражняюсь по книге Липпмана, выполняю задания по теме классы.
Необходимо реализовать класс 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++
C++ Константные указатели и указатели на константу
C++ В каких случаях компилятор делает функции-члены класса встроенными (inline)?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 11:02     Константные функции-члены класса, возвращающие ссылку на константу #46
Цитата Сообщение от Сыроежка Посмотреть сообщение
На мой взгляд, это совершенно ясно
Это на ваш взгляд. А, например, на мой взгляд "избежать возможности изменять" и "неумышленно изменить" - разные вещи. Так что, как видите, вы не являетесь последней инстанцией и не уполномочены додумывать за людьми недосказанное. Пока автор не уточнил свои слова, не стоит так категорично пояснять то, как вы их поняли.
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,911
11.08.2011, 12:09     Константные функции-члены класса, возвращающие ссылку на константу #47
Пока так и не увидел ни одного реального довода в пользу НЕиспользования константных ссылок в качестве возвращаемого значения. Пример вроде
C++
1
const string& sss = ( person( str1, str2 ).get_name() );
выглядит как-то не очень убедительно. А по поводу const_cast полностью согласен с вышесказанным:
Цитата Сообщение от Сыроежка Посмотреть сообщение
если вы умышленно меняете то, что не предназначалось для изменения, как вы предложили с помощью const_cast, то вы - вредитель.
easybudda
Эксперт CЭксперт С++
9465 / 5478 / 927
Регистрация: 25.07.2009
Сообщений: 10,502
11.08.2011, 12:26     Константные функции-члены класса, возвращающие ссылку на константу #48
Цитата Сообщение от rangerx Посмотреть сообщение
Пока так и не увидел ни одного реального довода в пользу НЕиспользования константных ссылок в качестве возвращаемого значения.
Утверждение вроде "Пользователи класса НЕ должны иметь прямого доступа к его скрытым членам" - не аргумент?

Цитата Сообщение от Deviaphan Посмотреть сообщение
Только вот некоторые бездари используют приведение типа в стиле Си
Если это на мой садовый участок кирпич, так и средствами С++ вполне можно ссылку на константный объект сделать ссылкой на неконстантный... Вообще думаю, первое, что сделает начинающий и не слишком хорошо учившийся программист при сообщении компилятора "... bla bla bla const bla bla bla..." - постарается от константности избавиться. И таки добьётся своего. Что будет дальше - загадка...
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.08.2011, 13:14     Константные функции-члены класса, возвращающие ссылку на константу #49
Цитата Сообщение от rangerx Посмотреть сообщение
Пока так и не увидел ни одного реального довода в пользу НЕиспользования константных ссылок в качестве возвращаемого значения.
Основная пробелама ссылок, это то что они могут пережить объект на который ссылаются. Чем не повод (наряду с соблюдением инкапсуляции) не возвращать их?
Цитата Сообщение от Сыроежка Посмотреть сообщение
Потому что если вы умышленно меняете то, что не предназначалось для изменения, как вы предложили с помощью const_cast, то вы - вредитель.
Я никого константность снимать и не призываю, я лишь указал на то, что возврат константной ссылки на внутренности объекта никак не позволит
Цитата Сообщение от lavan Посмотреть сообщение
избежать возможности изменять private часть класса без использования интерфейса
Кроме того, если вы, как разработчик класса, даете лазейку в виде применения const_cast клиентам, то это исключительно Ваша проблема, что Вы не сумели продумать дизайн, действительно исключающий возможность изменения внутреннего состояния объекта Вашего класса за его пределами.
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
11.08.2011, 13:35     Константные функции-члены класса, возвращающие ссылку на константу #50
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Основная пробелама ссылок, это то что они могут пережить объект на который ссылаются. Чем не повод (наряду с соблюдением инкапсуляции) не возвращать их?
Ага, и от указателей по той же причине отказаться. Да и вообще от C++
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 13:37     Константные функции-члены класса, возвращающие ссылку на константу #51
grizlik78, а кто предлагал отказаться? Предлагается не возвращать ссылки на закрытые члены класса, и всего-то))
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
11.08.2011, 13:48     Константные функции-члены класса, возвращающие ссылку на константу #52
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну меня, по-крайней мере, не убедили.
Если пользователь случайно или намеренно меняет значения по ссылкам/указателям на константу, то он ССЗБ. Надо такому пользователью в одном из вызовов вернуть ссылку на настоящую константу, пусть попрыгает
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 14:06     Константные функции-члены класса, возвращающие ссылку на константу #53
Цитата Сообщение от grizlik78 Посмотреть сообщение
Надо такому пользователью в одном из вызовов вернуть ссылку на настоящую константу
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.08.2011, 16:33     Константные функции-члены класса, возвращающие ссылку на константу #54
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ага, и от указателей по той же причине отказаться.
Если Вы про встроенные указатели (T*), то, естественно, отказатся.
Avazart
Эксперт С++
7121 / 5298 / 273
Регистрация: 10.12.2010
Сообщений: 23,436
Записей в блоге: 17
11.08.2011, 23:08     Константные функции-члены класса, возвращающие ссылку на константу #55
должны лишь константную ссылку на строку, а не просто тип string, дабы избежать ненужного копирования.
Т.е если использовать const ... & ... , будет работать быстрее?
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 23:11     Константные функции-члены класса, возвращающие ссылку на константу #56
Avazart, разумеется. Возвращая string, вы возвращаете объект, т.е. копируете все его данные (в том числе надо выделить память под новую строку и скопировать в неё содержимое старой). Возвращая string &, вы, по сути, возвращаете адрес.
Avazart
Эксперт С++
7121 / 5298 / 273
Регистрация: 10.12.2010
Сообщений: 23,436
Записей в блоге: 17
11.08.2011, 23:57     Константные функции-члены класса, возвращающие ссылку на константу #57
Ну да, а const применяется что бы случайно не изменить содержание этого адреса
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.08.2011, 00:03     Константные функции-члены класса, возвращающие ссылку на константу #58
Avazart, ага, а const_cast отметает это дело, поэтому я всё-таки за возвращение копии.
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
12.08.2011, 07:14     Константные функции-члены класса, возвращающие ссылку на константу #59
Ну, с одной стороны стандарт разрешает компилятору из цепочки копирований объекта удалять очевидные. Если это относится и к случаю копирования в переменную объекта, возвращаемого из функции по значению, то это делает данный спор несколько бессмысленным. А с другой стороны итераторы STL, например, специально спроектированы так, что после изменения контейнера становятся недействительными, но из-за этого никто не призывает от них отказаться.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2011, 11:36     Константные функции-члены класса, возвращающие ссылку на константу
Еще ссылки по теме:
Константные поля класса C++
C++ Константные статические объекты класса.
Константные методы и объекты класса C++
Где инициализировать константные данные класса? C++
Константные и не константные ссылки. Приведения типов. Нужно уточнение C++

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

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

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